├── .firebaserc ├── .gitignore ├── README.md ├── firebase.json ├── firestore.indexes.json ├── firestore.rules ├── functions ├── .gitignore ├── index.js ├── package-lock.json └── package.json ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.css ├── App.js ├── index.css ├── index.js ├── logo.svg ├── reportWebVitals.js └── setupTests.js └── tests ├── helpers.js └── rules.test.js /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "fireship-dev-17429" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Firebase Security Master Course 2 | 3 | 🛡️🔥 Enroll in the [Firebase Security Course](https://fireship.io/courses/firebase-security). 4 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "firestore": { 3 | "rules": "firestore.rules", 4 | "indexes": "firestore.indexes.json" 5 | }, 6 | "storage": { 7 | "rules": "storage.rules" 8 | }, 9 | "emulators": { 10 | "auth": { 11 | "port": 9099 12 | }, 13 | "functions": { 14 | "port": 5001 15 | }, 16 | "firestore": { 17 | "port": 8080 18 | }, 19 | "ui": { 20 | "enabled": true 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | "indexes": [ 3 | { 4 | "collectionGroup": "questions", 5 | "queryScope": "COLLECTION", 6 | "fields": [ 7 | { 8 | "fieldPath": "contentId", 9 | "order": "ASCENDING" 10 | }, 11 | { 12 | "fieldPath": "published", 13 | "order": "ASCENDING" 14 | } 15 | ] 16 | }, 17 | { 18 | "collectionGroup": "questions", 19 | "queryScope": "COLLECTION", 20 | "fields": [ 21 | { 22 | "fieldPath": "contentId", 23 | "order": "ASCENDING" 24 | }, 25 | { 26 | "fieldPath": "published", 27 | "order": "ASCENDING" 28 | }, 29 | { 30 | "fieldPath": "updatedAt", 31 | "order": "DESCENDING" 32 | } 33 | ] 34 | }, 35 | { 36 | "collectionGroup": "questions", 37 | "queryScope": "COLLECTION", 38 | "fields": [ 39 | { 40 | "fieldPath": "contentId", 41 | "order": "ASCENDING" 42 | }, 43 | { 44 | "fieldPath": "updatedAt", 45 | "order": "DESCENDING" 46 | }, 47 | { 48 | "fieldPath": "published", 49 | "order": "ASCENDING" 50 | } 51 | ] 52 | } 53 | ], 54 | "fieldOverrides": [] 55 | } 56 | -------------------------------------------------------------------------------- /firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | 5 | 6 | match /users/{userId} { 7 | 8 | allow read: if isSignedIn(); 9 | allow update, delete: if hasAnyRole(['admin']); 10 | 11 | } 12 | 13 | match /posts/{postId} { 14 | allow read: if ( isSignedIn() && resource.data.published ) || hasAnyRole(['admin']); 15 | allow create: if isValidNewPost() && hasAnyRole(['author']); 16 | allow update: if isValidUpdatedPost() && hasAnyRole(['author', 'editor', 'admin']); 17 | allow delete: if hasAnyRole(['admin']); 18 | } 19 | 20 | 21 | function isSignedIn() { 22 | return request.auth != null; 23 | } 24 | 25 | function hasAnyRole(roles) { 26 | return isSignedIn() 27 | && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny(roles) 28 | } 29 | 30 | function isValidNewPost() { 31 | let post = request.resource.data; 32 | let isOwner = post.uid == request.auth.uid; 33 | let isNow = request.time == request.resource.data.createdAt; 34 | let hasRequiredFields = post.keys().hasAll(['content', 'uid', 'createdAt', 'published']); 35 | 36 | return isOwner && hasRequiredFields && isNow; 37 | } 38 | 39 | function isValidUpdatedPost() { 40 | let post = request.resource.data; 41 | let hasRequiredFields = post.keys().hasAny(['content', 'updatedAt', 'published']); 42 | let isValidContent = post.content is string && post.content.size() < 5000; 43 | 44 | return hasRequiredFields && isValidContent; 45 | } 46 | 47 | } 48 | } 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | // rules_version = '2'; 63 | // service cloud.firestore { 64 | // match /databases/{database}/documents { 65 | 66 | // match /{document=**} { 67 | // allow read, write: if false; 68 | // } 69 | 70 | // match /messages/{docId} { 71 | // allow read: if request.auth.uid != null; 72 | // allow create: if canCreateMessage(); 73 | // } 74 | 75 | // function canCreateMessage() { 76 | // let isSignedIn = request.auth.uid != null; 77 | // let isOwner = request.auth.uid == request.resource.data.uid; 78 | // let isNotTooLong = request.resource.data.text.size() < 255; 79 | // let isNow = request.time == request.resource.data.createdAt; 80 | 81 | // let isNotBanned = exists( 82 | // /databases/$(database)/documents/banned/$(request.auth.uid) 83 | // ) == false; 84 | 85 | // return isSignedIn && isOwner && isNotTooLong && isNow && isNotBanned; 86 | // } 87 | 88 | // } 89 | // } 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | // rules_version = '2'; 115 | // service cloud.firestore { 116 | // match /databases/{database}/documents { 117 | 118 | // match /todos/{docId} { 119 | 120 | // allow create: if isLoggedIn() && hasProfile(request.auth.uid) 121 | 122 | 123 | // allow delete: if isLoggedIn() && isAdmin(request.auth.uid) 124 | // } 125 | 126 | 127 | // function isLoggedIn() { 128 | // return request.auth.uid != null; 129 | // } 130 | 131 | // function hasProfile(uid) { 132 | // return exists(/databases/$(database)/documents/users/$(uid)) 133 | // } 134 | 135 | // function isAdmin(uid) { 136 | // let profile = get(/databases/$(database)/documents/users/$(uid)) 137 | 138 | // return profile.data.admin == true 139 | // } 140 | 141 | 142 | 143 | 144 | 145 | // } 146 | // } 147 | 148 | 149 | 150 | 151 | 152 | 153 | // match /users/{userId} { 154 | 155 | // allow read: if isLoggedIn(); 156 | // allow write: if belongsTo(userId); 157 | 158 | // } 159 | 160 | // match /todos/{docId} { 161 | 162 | // allow read: if resource.data.status == 'published'; 163 | 164 | // allow create: if canCreateTodo(); 165 | 166 | 167 | // allow update: if belongsTo() 168 | // && request.resource.data.keys().hasOnly(['text', 'status']); 169 | // } 170 | 171 | // function isLoggedIn() { 172 | // return request.auth.uid != null; 173 | // } 174 | 175 | // function belongsTo(userId) { 176 | // return request.auth.uid == userId || request.auth.uid == resource.data.uid; 177 | // } 178 | 179 | // function canCreateTodo() { 180 | // let uid = request.auth.uid; 181 | // let hasValidTimestamp = request.time == request.resource.data.createdAt; 182 | 183 | // return belongsTo(uid) && hasValidTimestamp; 184 | // } 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | // match /users/{userId} { 196 | 197 | // allow read: if request.auth.uid != null; 198 | // allow write: if request.auth.uid == userId; 199 | 200 | // } 201 | 202 | // match /todos/{docId} { 203 | 204 | // allow read: if resource.data.status == 'published'; 205 | 206 | // allow create: if request.auth.uid == resource.data.uid 207 | // && request.time == request.resource.data.createdAt; 208 | 209 | 210 | // allow update: if request.auth.uid == resource.data.uid 211 | // && request.resource.data.keys().hasOnly(['text', 'status']); 212 | // } 213 | 214 | 215 | 216 | 217 | // match /users/someId { 218 | // // Single document 219 | // } 220 | 221 | // match /users/{docId} { 222 | // // Single Collection 223 | // } 224 | 225 | // match /users/{docId=**} { 226 | // // Recursive wildcard, includes all subcollections 227 | // } 228 | 229 | 230 | 231 | // match /users/{docId=**} { 232 | 233 | // allow read, write; 234 | 235 | // allow get; 236 | // allow list; 237 | 238 | // allow create; 239 | // allow update; 240 | // allow delete; 241 | 242 | // } -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | 3 | // // Create and Deploy Your First Cloud Functions 4 | // // https://firebase.google.com/docs/functions/write-firebase-functions 5 | // 6 | // exports.helloWorld = functions.https.onRequest((request, response) => { 7 | // functions.logger.info("Hello logs!", {structuredData: true}); 8 | // response.send("Hello from Firebase!"); 9 | // }); 10 | -------------------------------------------------------------------------------- /functions/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@firebase/app-types": { 7 | "version": "0.6.1", 8 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", 9 | "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" 10 | }, 11 | "@firebase/auth-interop-types": { 12 | "version": "0.1.5", 13 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", 14 | "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" 15 | }, 16 | "@firebase/component": { 17 | "version": "0.1.19", 18 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", 19 | "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", 20 | "requires": { 21 | "@firebase/util": "0.3.2", 22 | "tslib": "^1.11.1" 23 | } 24 | }, 25 | "@firebase/database": { 26 | "version": "0.6.13", 27 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.13.tgz", 28 | "integrity": "sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA==", 29 | "requires": { 30 | "@firebase/auth-interop-types": "0.1.5", 31 | "@firebase/component": "0.1.19", 32 | "@firebase/database-types": "0.5.2", 33 | "@firebase/logger": "0.2.6", 34 | "@firebase/util": "0.3.2", 35 | "faye-websocket": "0.11.3", 36 | "tslib": "^1.11.1" 37 | } 38 | }, 39 | "@firebase/database-types": { 40 | "version": "0.5.2", 41 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz", 42 | "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==", 43 | "requires": { 44 | "@firebase/app-types": "0.6.1" 45 | } 46 | }, 47 | "@firebase/logger": { 48 | "version": "0.2.6", 49 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", 50 | "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" 51 | }, 52 | "@firebase/util": { 53 | "version": "0.3.2", 54 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", 55 | "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", 56 | "requires": { 57 | "tslib": "^1.11.1" 58 | } 59 | }, 60 | "@google-cloud/common": { 61 | "version": "3.5.0", 62 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.5.0.tgz", 63 | "integrity": "sha512-10d7ZAvKhq47L271AqvHEd8KzJqGU45TY+rwM2Z3JHuB070FeTi7oJJd7elfrnKaEvaktw3hH2wKnRWxk/3oWQ==", 64 | "optional": true, 65 | "requires": { 66 | "@google-cloud/projectify": "^2.0.0", 67 | "@google-cloud/promisify": "^2.0.0", 68 | "arrify": "^2.0.1", 69 | "duplexify": "^4.1.1", 70 | "ent": "^2.2.0", 71 | "extend": "^3.0.2", 72 | "google-auth-library": "^6.1.1", 73 | "retry-request": "^4.1.1", 74 | "teeny-request": "^7.0.0" 75 | } 76 | }, 77 | "@google-cloud/firestore": { 78 | "version": "4.7.1", 79 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.7.1.tgz", 80 | "integrity": "sha512-Qici+WKB6uRdDS1S3CaxGrIaCl4Bck70DYSzA5dZFkTU03Jj5DKXC4PYeUkfCAiB4haj7tzx+2ye7rhLxPclhQ==", 81 | "optional": true, 82 | "requires": { 83 | "fast-deep-equal": "^3.1.1", 84 | "functional-red-black-tree": "^1.0.1", 85 | "google-gax": "^2.9.2" 86 | } 87 | }, 88 | "@google-cloud/paginator": { 89 | "version": "3.0.5", 90 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", 91 | "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", 92 | "optional": true, 93 | "requires": { 94 | "arrify": "^2.0.0", 95 | "extend": "^3.0.2" 96 | } 97 | }, 98 | "@google-cloud/projectify": { 99 | "version": "2.0.1", 100 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", 101 | "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==", 102 | "optional": true 103 | }, 104 | "@google-cloud/promisify": { 105 | "version": "2.0.3", 106 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", 107 | "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==", 108 | "optional": true 109 | }, 110 | "@google-cloud/storage": { 111 | "version": "5.5.0", 112 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.5.0.tgz", 113 | "integrity": "sha512-Pat83kHNnKJpEHUirtQtCoAJ2K3OlEo2ZcSlPjierJnEKnhbIQPyJ6mAbs/ovm3K3QDQhouKJ9QSONkFPEwQuA==", 114 | "optional": true, 115 | "requires": { 116 | "@google-cloud/common": "^3.3.0", 117 | "@google-cloud/paginator": "^3.0.0", 118 | "@google-cloud/promisify": "^2.0.0", 119 | "arrify": "^2.0.0", 120 | "compressible": "^2.0.12", 121 | "date-and-time": "^0.14.0", 122 | "duplexify": "^4.0.0", 123 | "extend": "^3.0.2", 124 | "gaxios": "^4.0.0", 125 | "gcs-resumable-upload": "^3.1.0", 126 | "get-stream": "^6.0.0", 127 | "hash-stream-validation": "^0.2.2", 128 | "mime": "^2.2.0", 129 | "mime-types": "^2.0.8", 130 | "onetime": "^5.1.0", 131 | "p-limit": "^3.0.1", 132 | "pumpify": "^2.0.0", 133 | "snakeize": "^0.1.0", 134 | "stream-events": "^1.0.1", 135 | "xdg-basedir": "^4.0.0" 136 | }, 137 | "dependencies": { 138 | "p-limit": { 139 | "version": "3.1.0", 140 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 141 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 142 | "optional": true, 143 | "requires": { 144 | "yocto-queue": "^0.1.0" 145 | } 146 | } 147 | } 148 | }, 149 | "@grpc/grpc-js": { 150 | "version": "1.1.8", 151 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", 152 | "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", 153 | "optional": true, 154 | "requires": { 155 | "@grpc/proto-loader": "^0.6.0-pre14", 156 | "@types/node": "^12.12.47", 157 | "google-auth-library": "^6.0.0", 158 | "semver": "^6.2.0" 159 | }, 160 | "dependencies": { 161 | "@grpc/proto-loader": { 162 | "version": "0.6.0-pre9", 163 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", 164 | "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", 165 | "optional": true, 166 | "requires": { 167 | "@types/long": "^4.0.1", 168 | "lodash.camelcase": "^4.3.0", 169 | "long": "^4.0.0", 170 | "protobufjs": "^6.9.0", 171 | "yargs": "^15.3.1" 172 | } 173 | }, 174 | "@types/node": { 175 | "version": "12.19.7", 176 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.7.tgz", 177 | "integrity": "sha512-zvjOU1g4CpPilbTDUATnZCUb/6lARMRAqzT7ILwl1P3YvU2leEcZ2+fw9+Jrw/paXB1CgQyXTrN4hWDtqT9O2A==", 178 | "optional": true 179 | } 180 | } 181 | }, 182 | "@grpc/proto-loader": { 183 | "version": "0.5.5", 184 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", 185 | "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", 186 | "optional": true, 187 | "requires": { 188 | "lodash.camelcase": "^4.3.0", 189 | "protobufjs": "^6.8.6" 190 | } 191 | }, 192 | "@protobufjs/aspromise": { 193 | "version": "1.1.2", 194 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 195 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", 196 | "optional": true 197 | }, 198 | "@protobufjs/base64": { 199 | "version": "1.1.2", 200 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 201 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", 202 | "optional": true 203 | }, 204 | "@protobufjs/codegen": { 205 | "version": "2.0.4", 206 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 207 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", 208 | "optional": true 209 | }, 210 | "@protobufjs/eventemitter": { 211 | "version": "1.1.0", 212 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 213 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", 214 | "optional": true 215 | }, 216 | "@protobufjs/fetch": { 217 | "version": "1.1.0", 218 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 219 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 220 | "optional": true, 221 | "requires": { 222 | "@protobufjs/aspromise": "^1.1.1", 223 | "@protobufjs/inquire": "^1.1.0" 224 | } 225 | }, 226 | "@protobufjs/float": { 227 | "version": "1.0.2", 228 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 229 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", 230 | "optional": true 231 | }, 232 | "@protobufjs/inquire": { 233 | "version": "1.1.0", 234 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 235 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", 236 | "optional": true 237 | }, 238 | "@protobufjs/path": { 239 | "version": "1.1.2", 240 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 241 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", 242 | "optional": true 243 | }, 244 | "@protobufjs/pool": { 245 | "version": "1.1.0", 246 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 247 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", 248 | "optional": true 249 | }, 250 | "@protobufjs/utf8": { 251 | "version": "1.1.0", 252 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 253 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", 254 | "optional": true 255 | }, 256 | "@tootallnate/once": { 257 | "version": "1.1.2", 258 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 259 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 260 | "optional": true 261 | }, 262 | "@types/body-parser": { 263 | "version": "1.19.0", 264 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", 265 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", 266 | "requires": { 267 | "@types/connect": "*", 268 | "@types/node": "*" 269 | } 270 | }, 271 | "@types/connect": { 272 | "version": "3.4.33", 273 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", 274 | "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", 275 | "requires": { 276 | "@types/node": "*" 277 | } 278 | }, 279 | "@types/express": { 280 | "version": "4.17.3", 281 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", 282 | "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", 283 | "requires": { 284 | "@types/body-parser": "*", 285 | "@types/express-serve-static-core": "*", 286 | "@types/serve-static": "*" 287 | } 288 | }, 289 | "@types/express-serve-static-core": { 290 | "version": "4.17.14", 291 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz", 292 | "integrity": "sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA==", 293 | "requires": { 294 | "@types/node": "*", 295 | "@types/qs": "*", 296 | "@types/range-parser": "*" 297 | } 298 | }, 299 | "@types/lodash": { 300 | "version": "4.14.165", 301 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", 302 | "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==", 303 | "dev": true 304 | }, 305 | "@types/long": { 306 | "version": "4.0.1", 307 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 308 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", 309 | "optional": true 310 | }, 311 | "@types/mime": { 312 | "version": "2.0.3", 313 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", 314 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" 315 | }, 316 | "@types/node": { 317 | "version": "10.17.47", 318 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.47.tgz", 319 | "integrity": "sha512-YZ1mMAdUPouBZCdeugjV8y1tqqr28OyL8DYbH5ePCfe9zcXtvbh1wDBy7uzlHkXo3Qi07kpzXfvycvrkby/jXw==" 320 | }, 321 | "@types/qs": { 322 | "version": "6.9.5", 323 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", 324 | "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" 325 | }, 326 | "@types/range-parser": { 327 | "version": "1.2.3", 328 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", 329 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" 330 | }, 331 | "@types/serve-static": { 332 | "version": "1.13.8", 333 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", 334 | "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", 335 | "requires": { 336 | "@types/mime": "*", 337 | "@types/node": "*" 338 | } 339 | }, 340 | "abort-controller": { 341 | "version": "3.0.0", 342 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 343 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 344 | "optional": true, 345 | "requires": { 346 | "event-target-shim": "^5.0.0" 347 | } 348 | }, 349 | "accepts": { 350 | "version": "1.3.7", 351 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 352 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 353 | "requires": { 354 | "mime-types": "~2.1.24", 355 | "negotiator": "0.6.2" 356 | } 357 | }, 358 | "agent-base": { 359 | "version": "6.0.2", 360 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 361 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 362 | "optional": true, 363 | "requires": { 364 | "debug": "4" 365 | } 366 | }, 367 | "ansi-regex": { 368 | "version": "5.0.0", 369 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 370 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 371 | "optional": true 372 | }, 373 | "ansi-styles": { 374 | "version": "4.3.0", 375 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 376 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 377 | "optional": true, 378 | "requires": { 379 | "color-convert": "^2.0.1" 380 | } 381 | }, 382 | "array-flatten": { 383 | "version": "1.1.1", 384 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 385 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 386 | }, 387 | "arrify": { 388 | "version": "2.0.1", 389 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 390 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", 391 | "optional": true 392 | }, 393 | "base64-js": { 394 | "version": "1.5.1", 395 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 396 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 397 | "optional": true 398 | }, 399 | "bignumber.js": { 400 | "version": "9.0.1", 401 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", 402 | "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", 403 | "optional": true 404 | }, 405 | "body-parser": { 406 | "version": "1.19.0", 407 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 408 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 409 | "requires": { 410 | "bytes": "3.1.0", 411 | "content-type": "~1.0.4", 412 | "debug": "2.6.9", 413 | "depd": "~1.1.2", 414 | "http-errors": "1.7.2", 415 | "iconv-lite": "0.4.24", 416 | "on-finished": "~2.3.0", 417 | "qs": "6.7.0", 418 | "raw-body": "2.4.0", 419 | "type-is": "~1.6.17" 420 | }, 421 | "dependencies": { 422 | "debug": { 423 | "version": "2.6.9", 424 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 425 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 426 | "requires": { 427 | "ms": "2.0.0" 428 | } 429 | }, 430 | "ms": { 431 | "version": "2.0.0", 432 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 433 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 434 | } 435 | } 436 | }, 437 | "buffer-equal-constant-time": { 438 | "version": "1.0.1", 439 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 440 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 441 | }, 442 | "bytes": { 443 | "version": "3.1.0", 444 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 445 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 446 | }, 447 | "camelcase": { 448 | "version": "5.3.1", 449 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 450 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 451 | "optional": true 452 | }, 453 | "cliui": { 454 | "version": "6.0.0", 455 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", 456 | "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", 457 | "optional": true, 458 | "requires": { 459 | "string-width": "^4.2.0", 460 | "strip-ansi": "^6.0.0", 461 | "wrap-ansi": "^6.2.0" 462 | } 463 | }, 464 | "color-convert": { 465 | "version": "2.0.1", 466 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 467 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 468 | "optional": true, 469 | "requires": { 470 | "color-name": "~1.1.4" 471 | } 472 | }, 473 | "color-name": { 474 | "version": "1.1.4", 475 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 476 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 477 | "optional": true 478 | }, 479 | "compressible": { 480 | "version": "2.0.18", 481 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 482 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 483 | "optional": true, 484 | "requires": { 485 | "mime-db": ">= 1.43.0 < 2" 486 | } 487 | }, 488 | "configstore": { 489 | "version": "5.0.1", 490 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 491 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 492 | "optional": true, 493 | "requires": { 494 | "dot-prop": "^5.2.0", 495 | "graceful-fs": "^4.1.2", 496 | "make-dir": "^3.0.0", 497 | "unique-string": "^2.0.0", 498 | "write-file-atomic": "^3.0.0", 499 | "xdg-basedir": "^4.0.0" 500 | } 501 | }, 502 | "content-disposition": { 503 | "version": "0.5.3", 504 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 505 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 506 | "requires": { 507 | "safe-buffer": "5.1.2" 508 | }, 509 | "dependencies": { 510 | "safe-buffer": { 511 | "version": "5.1.2", 512 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 513 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 514 | } 515 | } 516 | }, 517 | "content-type": { 518 | "version": "1.0.4", 519 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 520 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 521 | }, 522 | "cookie": { 523 | "version": "0.4.0", 524 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 525 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 526 | }, 527 | "cookie-signature": { 528 | "version": "1.0.6", 529 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 530 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 531 | }, 532 | "cors": { 533 | "version": "2.8.5", 534 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 535 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 536 | "requires": { 537 | "object-assign": "^4", 538 | "vary": "^1" 539 | } 540 | }, 541 | "crypto-random-string": { 542 | "version": "2.0.0", 543 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 544 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", 545 | "optional": true 546 | }, 547 | "date-and-time": { 548 | "version": "0.14.1", 549 | "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.1.tgz", 550 | "integrity": "sha512-M4RggEH5OF2ZuCOxgOU67R6Z9ohjKbxGvAQz48vj53wLmL0bAgumkBvycR32f30pK+Og9pIR+RFDyChbaE4oLA==", 551 | "optional": true 552 | }, 553 | "debug": { 554 | "version": "4.3.1", 555 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 556 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 557 | "optional": true, 558 | "requires": { 559 | "ms": "2.1.2" 560 | } 561 | }, 562 | "decamelize": { 563 | "version": "1.2.0", 564 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 565 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 566 | "optional": true 567 | }, 568 | "depd": { 569 | "version": "1.1.2", 570 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 571 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 572 | }, 573 | "destroy": { 574 | "version": "1.0.4", 575 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 576 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 577 | }, 578 | "dicer": { 579 | "version": "0.3.0", 580 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", 581 | "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", 582 | "requires": { 583 | "streamsearch": "0.1.2" 584 | } 585 | }, 586 | "dot-prop": { 587 | "version": "5.3.0", 588 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 589 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", 590 | "optional": true, 591 | "requires": { 592 | "is-obj": "^2.0.0" 593 | } 594 | }, 595 | "duplexify": { 596 | "version": "4.1.1", 597 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 598 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 599 | "optional": true, 600 | "requires": { 601 | "end-of-stream": "^1.4.1", 602 | "inherits": "^2.0.3", 603 | "readable-stream": "^3.1.1", 604 | "stream-shift": "^1.0.0" 605 | } 606 | }, 607 | "ecdsa-sig-formatter": { 608 | "version": "1.0.11", 609 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 610 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 611 | "requires": { 612 | "safe-buffer": "^5.0.1" 613 | } 614 | }, 615 | "ee-first": { 616 | "version": "1.1.1", 617 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 618 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 619 | }, 620 | "emoji-regex": { 621 | "version": "8.0.0", 622 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 623 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 624 | "optional": true 625 | }, 626 | "encodeurl": { 627 | "version": "1.0.2", 628 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 629 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 630 | }, 631 | "end-of-stream": { 632 | "version": "1.4.4", 633 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 634 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 635 | "optional": true, 636 | "requires": { 637 | "once": "^1.4.0" 638 | } 639 | }, 640 | "ent": { 641 | "version": "2.2.0", 642 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 643 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", 644 | "optional": true 645 | }, 646 | "escape-html": { 647 | "version": "1.0.3", 648 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 649 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 650 | }, 651 | "etag": { 652 | "version": "1.8.1", 653 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 654 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 655 | }, 656 | "event-target-shim": { 657 | "version": "5.0.1", 658 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 659 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 660 | "optional": true 661 | }, 662 | "express": { 663 | "version": "4.17.1", 664 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 665 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 666 | "requires": { 667 | "accepts": "~1.3.7", 668 | "array-flatten": "1.1.1", 669 | "body-parser": "1.19.0", 670 | "content-disposition": "0.5.3", 671 | "content-type": "~1.0.4", 672 | "cookie": "0.4.0", 673 | "cookie-signature": "1.0.6", 674 | "debug": "2.6.9", 675 | "depd": "~1.1.2", 676 | "encodeurl": "~1.0.2", 677 | "escape-html": "~1.0.3", 678 | "etag": "~1.8.1", 679 | "finalhandler": "~1.1.2", 680 | "fresh": "0.5.2", 681 | "merge-descriptors": "1.0.1", 682 | "methods": "~1.1.2", 683 | "on-finished": "~2.3.0", 684 | "parseurl": "~1.3.3", 685 | "path-to-regexp": "0.1.7", 686 | "proxy-addr": "~2.0.5", 687 | "qs": "6.7.0", 688 | "range-parser": "~1.2.1", 689 | "safe-buffer": "5.1.2", 690 | "send": "0.17.1", 691 | "serve-static": "1.14.1", 692 | "setprototypeof": "1.1.1", 693 | "statuses": "~1.5.0", 694 | "type-is": "~1.6.18", 695 | "utils-merge": "1.0.1", 696 | "vary": "~1.1.2" 697 | }, 698 | "dependencies": { 699 | "debug": { 700 | "version": "2.6.9", 701 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 702 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 703 | "requires": { 704 | "ms": "2.0.0" 705 | } 706 | }, 707 | "ms": { 708 | "version": "2.0.0", 709 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 710 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 711 | }, 712 | "safe-buffer": { 713 | "version": "5.1.2", 714 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 715 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 716 | } 717 | } 718 | }, 719 | "extend": { 720 | "version": "3.0.2", 721 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 722 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 723 | "optional": true 724 | }, 725 | "fast-deep-equal": { 726 | "version": "3.1.3", 727 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 728 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 729 | "optional": true 730 | }, 731 | "fast-text-encoding": { 732 | "version": "1.0.3", 733 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", 734 | "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", 735 | "optional": true 736 | }, 737 | "faye-websocket": { 738 | "version": "0.11.3", 739 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", 740 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", 741 | "requires": { 742 | "websocket-driver": ">=0.5.1" 743 | } 744 | }, 745 | "finalhandler": { 746 | "version": "1.1.2", 747 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 748 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 749 | "requires": { 750 | "debug": "2.6.9", 751 | "encodeurl": "~1.0.2", 752 | "escape-html": "~1.0.3", 753 | "on-finished": "~2.3.0", 754 | "parseurl": "~1.3.3", 755 | "statuses": "~1.5.0", 756 | "unpipe": "~1.0.0" 757 | }, 758 | "dependencies": { 759 | "debug": { 760 | "version": "2.6.9", 761 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 762 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 763 | "requires": { 764 | "ms": "2.0.0" 765 | } 766 | }, 767 | "ms": { 768 | "version": "2.0.0", 769 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 770 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 771 | } 772 | } 773 | }, 774 | "find-up": { 775 | "version": "4.1.0", 776 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 777 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 778 | "optional": true, 779 | "requires": { 780 | "locate-path": "^5.0.0", 781 | "path-exists": "^4.0.0" 782 | } 783 | }, 784 | "firebase-admin": { 785 | "version": "9.4.1", 786 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.4.1.tgz", 787 | "integrity": "sha512-y9r2Mz2x1WTr60YrCDqz8Lw70DlwIvRIieVltP+UdRogkVpfnvyd+bi4D0KPlujW3teqcFPmxuzsXB+DP5vGfQ==", 788 | "requires": { 789 | "@firebase/database": "^0.6.10", 790 | "@firebase/database-types": "^0.5.2", 791 | "@google-cloud/firestore": "^4.5.0", 792 | "@google-cloud/storage": "^5.3.0", 793 | "@types/node": "^10.10.0", 794 | "dicer": "^0.3.0", 795 | "jsonwebtoken": "^8.5.1", 796 | "node-forge": "^0.10.0" 797 | } 798 | }, 799 | "firebase-functions": { 800 | "version": "3.11.0", 801 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.11.0.tgz", 802 | "integrity": "sha512-i1uMhZ/M6i5SCI3ulKo7EWX0/LD+I5o6N+sk0HbOWfzyWfOl0iJTvQkR3BVDcjrlhPVC4xG1bDTLxd+DTkLqaw==", 803 | "requires": { 804 | "@types/express": "4.17.3", 805 | "cors": "^2.8.5", 806 | "express": "^4.17.1", 807 | "lodash": "^4.17.14" 808 | } 809 | }, 810 | "firebase-functions-test": { 811 | "version": "0.2.3", 812 | "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.3.tgz", 813 | "integrity": "sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==", 814 | "dev": true, 815 | "requires": { 816 | "@types/lodash": "^4.14.104", 817 | "lodash": "^4.17.5" 818 | } 819 | }, 820 | "forwarded": { 821 | "version": "0.1.2", 822 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 823 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 824 | }, 825 | "fresh": { 826 | "version": "0.5.2", 827 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 828 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 829 | }, 830 | "functional-red-black-tree": { 831 | "version": "1.0.1", 832 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 833 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 834 | "optional": true 835 | }, 836 | "gaxios": { 837 | "version": "4.0.1", 838 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", 839 | "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", 840 | "optional": true, 841 | "requires": { 842 | "abort-controller": "^3.0.0", 843 | "extend": "^3.0.2", 844 | "https-proxy-agent": "^5.0.0", 845 | "is-stream": "^2.0.0", 846 | "node-fetch": "^2.3.0" 847 | } 848 | }, 849 | "gcp-metadata": { 850 | "version": "4.2.1", 851 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", 852 | "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", 853 | "optional": true, 854 | "requires": { 855 | "gaxios": "^4.0.0", 856 | "json-bigint": "^1.0.0" 857 | } 858 | }, 859 | "gcs-resumable-upload": { 860 | "version": "3.1.1", 861 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", 862 | "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", 863 | "optional": true, 864 | "requires": { 865 | "abort-controller": "^3.0.0", 866 | "configstore": "^5.0.0", 867 | "extend": "^3.0.2", 868 | "gaxios": "^3.0.0", 869 | "google-auth-library": "^6.0.0", 870 | "pumpify": "^2.0.0", 871 | "stream-events": "^1.0.4" 872 | }, 873 | "dependencies": { 874 | "gaxios": { 875 | "version": "3.2.0", 876 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", 877 | "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", 878 | "optional": true, 879 | "requires": { 880 | "abort-controller": "^3.0.0", 881 | "extend": "^3.0.2", 882 | "https-proxy-agent": "^5.0.0", 883 | "is-stream": "^2.0.0", 884 | "node-fetch": "^2.3.0" 885 | } 886 | } 887 | } 888 | }, 889 | "get-caller-file": { 890 | "version": "2.0.5", 891 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 892 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 893 | "optional": true 894 | }, 895 | "get-stream": { 896 | "version": "6.0.0", 897 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", 898 | "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", 899 | "optional": true 900 | }, 901 | "google-auth-library": { 902 | "version": "6.1.3", 903 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", 904 | "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", 905 | "optional": true, 906 | "requires": { 907 | "arrify": "^2.0.0", 908 | "base64-js": "^1.3.0", 909 | "ecdsa-sig-formatter": "^1.0.11", 910 | "fast-text-encoding": "^1.0.0", 911 | "gaxios": "^4.0.0", 912 | "gcp-metadata": "^4.2.0", 913 | "gtoken": "^5.0.4", 914 | "jws": "^4.0.0", 915 | "lru-cache": "^6.0.0" 916 | } 917 | }, 918 | "google-gax": { 919 | "version": "2.9.2", 920 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.2.tgz", 921 | "integrity": "sha512-Pve4osEzNKpBZqFXMfGKBbKCtgnHpUe5IQMh5Ou+Xtg8nLcba94L3gF0xgM5phMdGRRqJn0SMjcuEVmOYu7EBg==", 922 | "optional": true, 923 | "requires": { 924 | "@grpc/grpc-js": "~1.1.1", 925 | "@grpc/proto-loader": "^0.5.1", 926 | "@types/long": "^4.0.0", 927 | "abort-controller": "^3.0.0", 928 | "duplexify": "^4.0.0", 929 | "google-auth-library": "^6.1.3", 930 | "is-stream-ended": "^0.1.4", 931 | "node-fetch": "^2.6.1", 932 | "protobufjs": "^6.9.0", 933 | "retry-request": "^4.0.0" 934 | } 935 | }, 936 | "google-p12-pem": { 937 | "version": "3.0.3", 938 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", 939 | "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", 940 | "optional": true, 941 | "requires": { 942 | "node-forge": "^0.10.0" 943 | } 944 | }, 945 | "graceful-fs": { 946 | "version": "4.2.4", 947 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 948 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 949 | "optional": true 950 | }, 951 | "gtoken": { 952 | "version": "5.1.0", 953 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz", 954 | "integrity": "sha512-4d8N6Lk8TEAHl9vVoRVMh9BNOKWVgl2DdNtr3428O75r3QFrF/a5MMu851VmK0AA8+iSvbwRv69k5XnMLURGhg==", 955 | "optional": true, 956 | "requires": { 957 | "gaxios": "^4.0.0", 958 | "google-p12-pem": "^3.0.3", 959 | "jws": "^4.0.0", 960 | "mime": "^2.2.0" 961 | } 962 | }, 963 | "hash-stream-validation": { 964 | "version": "0.2.4", 965 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", 966 | "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", 967 | "optional": true 968 | }, 969 | "http-errors": { 970 | "version": "1.7.2", 971 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 972 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 973 | "requires": { 974 | "depd": "~1.1.2", 975 | "inherits": "2.0.3", 976 | "setprototypeof": "1.1.1", 977 | "statuses": ">= 1.5.0 < 2", 978 | "toidentifier": "1.0.0" 979 | }, 980 | "dependencies": { 981 | "inherits": { 982 | "version": "2.0.3", 983 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 984 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 985 | } 986 | } 987 | }, 988 | "http-parser-js": { 989 | "version": "0.5.2", 990 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", 991 | "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" 992 | }, 993 | "http-proxy-agent": { 994 | "version": "4.0.1", 995 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 996 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 997 | "optional": true, 998 | "requires": { 999 | "@tootallnate/once": "1", 1000 | "agent-base": "6", 1001 | "debug": "4" 1002 | } 1003 | }, 1004 | "https-proxy-agent": { 1005 | "version": "5.0.0", 1006 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1007 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1008 | "optional": true, 1009 | "requires": { 1010 | "agent-base": "6", 1011 | "debug": "4" 1012 | } 1013 | }, 1014 | "iconv-lite": { 1015 | "version": "0.4.24", 1016 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1017 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1018 | "requires": { 1019 | "safer-buffer": ">= 2.1.2 < 3" 1020 | } 1021 | }, 1022 | "imurmurhash": { 1023 | "version": "0.1.4", 1024 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1025 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1026 | "optional": true 1027 | }, 1028 | "inherits": { 1029 | "version": "2.0.4", 1030 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1031 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1032 | "optional": true 1033 | }, 1034 | "ipaddr.js": { 1035 | "version": "1.9.1", 1036 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1037 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1038 | }, 1039 | "is-fullwidth-code-point": { 1040 | "version": "3.0.0", 1041 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1042 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1043 | "optional": true 1044 | }, 1045 | "is-obj": { 1046 | "version": "2.0.0", 1047 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 1048 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 1049 | "optional": true 1050 | }, 1051 | "is-stream": { 1052 | "version": "2.0.0", 1053 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 1054 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", 1055 | "optional": true 1056 | }, 1057 | "is-stream-ended": { 1058 | "version": "0.1.4", 1059 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 1060 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", 1061 | "optional": true 1062 | }, 1063 | "is-typedarray": { 1064 | "version": "1.0.0", 1065 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1066 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1067 | "optional": true 1068 | }, 1069 | "json-bigint": { 1070 | "version": "1.0.0", 1071 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", 1072 | "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", 1073 | "optional": true, 1074 | "requires": { 1075 | "bignumber.js": "^9.0.0" 1076 | } 1077 | }, 1078 | "jsonwebtoken": { 1079 | "version": "8.5.1", 1080 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 1081 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 1082 | "requires": { 1083 | "jws": "^3.2.2", 1084 | "lodash.includes": "^4.3.0", 1085 | "lodash.isboolean": "^3.0.3", 1086 | "lodash.isinteger": "^4.0.4", 1087 | "lodash.isnumber": "^3.0.3", 1088 | "lodash.isplainobject": "^4.0.6", 1089 | "lodash.isstring": "^4.0.1", 1090 | "lodash.once": "^4.0.0", 1091 | "ms": "^2.1.1", 1092 | "semver": "^5.6.0" 1093 | }, 1094 | "dependencies": { 1095 | "jwa": { 1096 | "version": "1.4.1", 1097 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1098 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1099 | "requires": { 1100 | "buffer-equal-constant-time": "1.0.1", 1101 | "ecdsa-sig-formatter": "1.0.11", 1102 | "safe-buffer": "^5.0.1" 1103 | } 1104 | }, 1105 | "jws": { 1106 | "version": "3.2.2", 1107 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1108 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1109 | "requires": { 1110 | "jwa": "^1.4.1", 1111 | "safe-buffer": "^5.0.1" 1112 | } 1113 | }, 1114 | "semver": { 1115 | "version": "5.7.1", 1116 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1117 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1118 | } 1119 | } 1120 | }, 1121 | "jwa": { 1122 | "version": "2.0.0", 1123 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 1124 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 1125 | "optional": true, 1126 | "requires": { 1127 | "buffer-equal-constant-time": "1.0.1", 1128 | "ecdsa-sig-formatter": "1.0.11", 1129 | "safe-buffer": "^5.0.1" 1130 | } 1131 | }, 1132 | "jws": { 1133 | "version": "4.0.0", 1134 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 1135 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 1136 | "optional": true, 1137 | "requires": { 1138 | "jwa": "^2.0.0", 1139 | "safe-buffer": "^5.0.1" 1140 | } 1141 | }, 1142 | "locate-path": { 1143 | "version": "5.0.0", 1144 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1145 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1146 | "optional": true, 1147 | "requires": { 1148 | "p-locate": "^4.1.0" 1149 | } 1150 | }, 1151 | "lodash": { 1152 | "version": "4.17.20", 1153 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1154 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 1155 | }, 1156 | "lodash.camelcase": { 1157 | "version": "4.3.0", 1158 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1159 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", 1160 | "optional": true 1161 | }, 1162 | "lodash.includes": { 1163 | "version": "4.3.0", 1164 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1165 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1166 | }, 1167 | "lodash.isboolean": { 1168 | "version": "3.0.3", 1169 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1170 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1171 | }, 1172 | "lodash.isinteger": { 1173 | "version": "4.0.4", 1174 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1175 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1176 | }, 1177 | "lodash.isnumber": { 1178 | "version": "3.0.3", 1179 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1180 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1181 | }, 1182 | "lodash.isplainobject": { 1183 | "version": "4.0.6", 1184 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1185 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1186 | }, 1187 | "lodash.isstring": { 1188 | "version": "4.0.1", 1189 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1190 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1191 | }, 1192 | "lodash.once": { 1193 | "version": "4.1.1", 1194 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1195 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1196 | }, 1197 | "long": { 1198 | "version": "4.0.0", 1199 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1200 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", 1201 | "optional": true 1202 | }, 1203 | "lru-cache": { 1204 | "version": "6.0.0", 1205 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1206 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1207 | "optional": true, 1208 | "requires": { 1209 | "yallist": "^4.0.0" 1210 | } 1211 | }, 1212 | "make-dir": { 1213 | "version": "3.1.0", 1214 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1215 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1216 | "optional": true, 1217 | "requires": { 1218 | "semver": "^6.0.0" 1219 | } 1220 | }, 1221 | "media-typer": { 1222 | "version": "0.3.0", 1223 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1224 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1225 | }, 1226 | "merge-descriptors": { 1227 | "version": "1.0.1", 1228 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1229 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1230 | }, 1231 | "methods": { 1232 | "version": "1.1.2", 1233 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1234 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1235 | }, 1236 | "mime": { 1237 | "version": "2.4.6", 1238 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", 1239 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", 1240 | "optional": true 1241 | }, 1242 | "mime-db": { 1243 | "version": "1.45.0", 1244 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 1245 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", 1246 | "optional": true 1247 | }, 1248 | "mime-types": { 1249 | "version": "2.1.27", 1250 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1251 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1252 | "requires": { 1253 | "mime-db": "1.44.0" 1254 | }, 1255 | "dependencies": { 1256 | "mime-db": { 1257 | "version": "1.44.0", 1258 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1259 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1260 | } 1261 | } 1262 | }, 1263 | "mimic-fn": { 1264 | "version": "2.1.0", 1265 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1266 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1267 | "optional": true 1268 | }, 1269 | "ms": { 1270 | "version": "2.1.2", 1271 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1272 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1273 | }, 1274 | "negotiator": { 1275 | "version": "0.6.2", 1276 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1277 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1278 | }, 1279 | "node-fetch": { 1280 | "version": "2.6.1", 1281 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1282 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 1283 | "optional": true 1284 | }, 1285 | "node-forge": { 1286 | "version": "0.10.0", 1287 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", 1288 | "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" 1289 | }, 1290 | "object-assign": { 1291 | "version": "4.1.1", 1292 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1293 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1294 | }, 1295 | "on-finished": { 1296 | "version": "2.3.0", 1297 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1298 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1299 | "requires": { 1300 | "ee-first": "1.1.1" 1301 | } 1302 | }, 1303 | "once": { 1304 | "version": "1.4.0", 1305 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1306 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1307 | "optional": true, 1308 | "requires": { 1309 | "wrappy": "1" 1310 | } 1311 | }, 1312 | "onetime": { 1313 | "version": "5.1.2", 1314 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1315 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1316 | "optional": true, 1317 | "requires": { 1318 | "mimic-fn": "^2.1.0" 1319 | } 1320 | }, 1321 | "p-limit": { 1322 | "version": "2.3.0", 1323 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1324 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1325 | "optional": true, 1326 | "requires": { 1327 | "p-try": "^2.0.0" 1328 | } 1329 | }, 1330 | "p-locate": { 1331 | "version": "4.1.0", 1332 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1333 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1334 | "optional": true, 1335 | "requires": { 1336 | "p-limit": "^2.2.0" 1337 | } 1338 | }, 1339 | "p-try": { 1340 | "version": "2.2.0", 1341 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1342 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1343 | "optional": true 1344 | }, 1345 | "parseurl": { 1346 | "version": "1.3.3", 1347 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1348 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1349 | }, 1350 | "path-exists": { 1351 | "version": "4.0.0", 1352 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1353 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1354 | "optional": true 1355 | }, 1356 | "path-to-regexp": { 1357 | "version": "0.1.7", 1358 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1359 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1360 | }, 1361 | "protobufjs": { 1362 | "version": "6.10.2", 1363 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", 1364 | "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", 1365 | "optional": true, 1366 | "requires": { 1367 | "@protobufjs/aspromise": "^1.1.2", 1368 | "@protobufjs/base64": "^1.1.2", 1369 | "@protobufjs/codegen": "^2.0.4", 1370 | "@protobufjs/eventemitter": "^1.1.0", 1371 | "@protobufjs/fetch": "^1.1.0", 1372 | "@protobufjs/float": "^1.0.2", 1373 | "@protobufjs/inquire": "^1.1.0", 1374 | "@protobufjs/path": "^1.1.2", 1375 | "@protobufjs/pool": "^1.1.0", 1376 | "@protobufjs/utf8": "^1.1.0", 1377 | "@types/long": "^4.0.1", 1378 | "@types/node": "^13.7.0", 1379 | "long": "^4.0.0" 1380 | }, 1381 | "dependencies": { 1382 | "@types/node": { 1383 | "version": "13.13.33", 1384 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.33.tgz", 1385 | "integrity": "sha512-1B3GM1yuYsFyEvBb+ljBqWBOylsWDYioZ5wpu8AhXdIhq20neXS7eaSC8GkwHE0yQYGiOIV43lMsgRYTgKZefQ==", 1386 | "optional": true 1387 | } 1388 | } 1389 | }, 1390 | "proxy-addr": { 1391 | "version": "2.0.6", 1392 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1393 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1394 | "requires": { 1395 | "forwarded": "~0.1.2", 1396 | "ipaddr.js": "1.9.1" 1397 | } 1398 | }, 1399 | "pump": { 1400 | "version": "3.0.0", 1401 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1402 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1403 | "optional": true, 1404 | "requires": { 1405 | "end-of-stream": "^1.1.0", 1406 | "once": "^1.3.1" 1407 | } 1408 | }, 1409 | "pumpify": { 1410 | "version": "2.0.1", 1411 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", 1412 | "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", 1413 | "optional": true, 1414 | "requires": { 1415 | "duplexify": "^4.1.1", 1416 | "inherits": "^2.0.3", 1417 | "pump": "^3.0.0" 1418 | } 1419 | }, 1420 | "qs": { 1421 | "version": "6.7.0", 1422 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1423 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1424 | }, 1425 | "range-parser": { 1426 | "version": "1.2.1", 1427 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1428 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1429 | }, 1430 | "raw-body": { 1431 | "version": "2.4.0", 1432 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1433 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1434 | "requires": { 1435 | "bytes": "3.1.0", 1436 | "http-errors": "1.7.2", 1437 | "iconv-lite": "0.4.24", 1438 | "unpipe": "1.0.0" 1439 | } 1440 | }, 1441 | "readable-stream": { 1442 | "version": "3.6.0", 1443 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1444 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1445 | "optional": true, 1446 | "requires": { 1447 | "inherits": "^2.0.3", 1448 | "string_decoder": "^1.1.1", 1449 | "util-deprecate": "^1.0.1" 1450 | } 1451 | }, 1452 | "require-directory": { 1453 | "version": "2.1.1", 1454 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1455 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1456 | "optional": true 1457 | }, 1458 | "require-main-filename": { 1459 | "version": "2.0.0", 1460 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1461 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1462 | "optional": true 1463 | }, 1464 | "retry-request": { 1465 | "version": "4.1.3", 1466 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", 1467 | "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", 1468 | "optional": true, 1469 | "requires": { 1470 | "debug": "^4.1.1" 1471 | } 1472 | }, 1473 | "safe-buffer": { 1474 | "version": "5.2.1", 1475 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1476 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1477 | }, 1478 | "safer-buffer": { 1479 | "version": "2.1.2", 1480 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1481 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1482 | }, 1483 | "semver": { 1484 | "version": "6.3.0", 1485 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1486 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1487 | "optional": true 1488 | }, 1489 | "send": { 1490 | "version": "0.17.1", 1491 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1492 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1493 | "requires": { 1494 | "debug": "2.6.9", 1495 | "depd": "~1.1.2", 1496 | "destroy": "~1.0.4", 1497 | "encodeurl": "~1.0.2", 1498 | "escape-html": "~1.0.3", 1499 | "etag": "~1.8.1", 1500 | "fresh": "0.5.2", 1501 | "http-errors": "~1.7.2", 1502 | "mime": "1.6.0", 1503 | "ms": "2.1.1", 1504 | "on-finished": "~2.3.0", 1505 | "range-parser": "~1.2.1", 1506 | "statuses": "~1.5.0" 1507 | }, 1508 | "dependencies": { 1509 | "debug": { 1510 | "version": "2.6.9", 1511 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1512 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1513 | "requires": { 1514 | "ms": "2.0.0" 1515 | }, 1516 | "dependencies": { 1517 | "ms": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1520 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1521 | } 1522 | } 1523 | }, 1524 | "mime": { 1525 | "version": "1.6.0", 1526 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1527 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1528 | }, 1529 | "ms": { 1530 | "version": "2.1.1", 1531 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1532 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1533 | } 1534 | } 1535 | }, 1536 | "serve-static": { 1537 | "version": "1.14.1", 1538 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1539 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1540 | "requires": { 1541 | "encodeurl": "~1.0.2", 1542 | "escape-html": "~1.0.3", 1543 | "parseurl": "~1.3.3", 1544 | "send": "0.17.1" 1545 | } 1546 | }, 1547 | "set-blocking": { 1548 | "version": "2.0.0", 1549 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1550 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1551 | "optional": true 1552 | }, 1553 | "setprototypeof": { 1554 | "version": "1.1.1", 1555 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1556 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1557 | }, 1558 | "signal-exit": { 1559 | "version": "3.0.3", 1560 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1561 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 1562 | "optional": true 1563 | }, 1564 | "snakeize": { 1565 | "version": "0.1.0", 1566 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 1567 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", 1568 | "optional": true 1569 | }, 1570 | "statuses": { 1571 | "version": "1.5.0", 1572 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1573 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1574 | }, 1575 | "stream-events": { 1576 | "version": "1.0.5", 1577 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 1578 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 1579 | "optional": true, 1580 | "requires": { 1581 | "stubs": "^3.0.0" 1582 | } 1583 | }, 1584 | "stream-shift": { 1585 | "version": "1.0.1", 1586 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1587 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", 1588 | "optional": true 1589 | }, 1590 | "streamsearch": { 1591 | "version": "0.1.2", 1592 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1593 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1594 | }, 1595 | "string-width": { 1596 | "version": "4.2.0", 1597 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1598 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1599 | "optional": true, 1600 | "requires": { 1601 | "emoji-regex": "^8.0.0", 1602 | "is-fullwidth-code-point": "^3.0.0", 1603 | "strip-ansi": "^6.0.0" 1604 | } 1605 | }, 1606 | "string_decoder": { 1607 | "version": "1.3.0", 1608 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1609 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1610 | "optional": true, 1611 | "requires": { 1612 | "safe-buffer": "~5.2.0" 1613 | } 1614 | }, 1615 | "strip-ansi": { 1616 | "version": "6.0.0", 1617 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1618 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1619 | "optional": true, 1620 | "requires": { 1621 | "ansi-regex": "^5.0.0" 1622 | } 1623 | }, 1624 | "stubs": { 1625 | "version": "3.0.0", 1626 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 1627 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", 1628 | "optional": true 1629 | }, 1630 | "teeny-request": { 1631 | "version": "7.0.1", 1632 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", 1633 | "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", 1634 | "optional": true, 1635 | "requires": { 1636 | "http-proxy-agent": "^4.0.0", 1637 | "https-proxy-agent": "^5.0.0", 1638 | "node-fetch": "^2.6.1", 1639 | "stream-events": "^1.0.5", 1640 | "uuid": "^8.0.0" 1641 | } 1642 | }, 1643 | "toidentifier": { 1644 | "version": "1.0.0", 1645 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1646 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1647 | }, 1648 | "tslib": { 1649 | "version": "1.14.1", 1650 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1651 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1652 | }, 1653 | "type-is": { 1654 | "version": "1.6.18", 1655 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1656 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1657 | "requires": { 1658 | "media-typer": "0.3.0", 1659 | "mime-types": "~2.1.24" 1660 | } 1661 | }, 1662 | "typedarray-to-buffer": { 1663 | "version": "3.1.5", 1664 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1665 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1666 | "optional": true, 1667 | "requires": { 1668 | "is-typedarray": "^1.0.0" 1669 | } 1670 | }, 1671 | "unique-string": { 1672 | "version": "2.0.0", 1673 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 1674 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 1675 | "optional": true, 1676 | "requires": { 1677 | "crypto-random-string": "^2.0.0" 1678 | } 1679 | }, 1680 | "unpipe": { 1681 | "version": "1.0.0", 1682 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1683 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1684 | }, 1685 | "util-deprecate": { 1686 | "version": "1.0.2", 1687 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1688 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1689 | "optional": true 1690 | }, 1691 | "utils-merge": { 1692 | "version": "1.0.1", 1693 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1694 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1695 | }, 1696 | "uuid": { 1697 | "version": "8.3.1", 1698 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", 1699 | "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", 1700 | "optional": true 1701 | }, 1702 | "vary": { 1703 | "version": "1.1.2", 1704 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1705 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1706 | }, 1707 | "websocket-driver": { 1708 | "version": "0.7.4", 1709 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 1710 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 1711 | "requires": { 1712 | "http-parser-js": ">=0.5.1", 1713 | "safe-buffer": ">=5.1.0", 1714 | "websocket-extensions": ">=0.1.1" 1715 | } 1716 | }, 1717 | "websocket-extensions": { 1718 | "version": "0.1.4", 1719 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 1720 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" 1721 | }, 1722 | "which-module": { 1723 | "version": "2.0.0", 1724 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1725 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1726 | "optional": true 1727 | }, 1728 | "wrap-ansi": { 1729 | "version": "6.2.0", 1730 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 1731 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 1732 | "optional": true, 1733 | "requires": { 1734 | "ansi-styles": "^4.0.0", 1735 | "string-width": "^4.1.0", 1736 | "strip-ansi": "^6.0.0" 1737 | } 1738 | }, 1739 | "wrappy": { 1740 | "version": "1.0.2", 1741 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1742 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1743 | "optional": true 1744 | }, 1745 | "write-file-atomic": { 1746 | "version": "3.0.3", 1747 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 1748 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 1749 | "optional": true, 1750 | "requires": { 1751 | "imurmurhash": "^0.1.4", 1752 | "is-typedarray": "^1.0.0", 1753 | "signal-exit": "^3.0.2", 1754 | "typedarray-to-buffer": "^3.1.5" 1755 | } 1756 | }, 1757 | "xdg-basedir": { 1758 | "version": "4.0.0", 1759 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1760 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", 1761 | "optional": true 1762 | }, 1763 | "y18n": { 1764 | "version": "4.0.0", 1765 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1766 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1767 | "optional": true 1768 | }, 1769 | "yallist": { 1770 | "version": "4.0.0", 1771 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1772 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1773 | "optional": true 1774 | }, 1775 | "yargs": { 1776 | "version": "15.4.1", 1777 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", 1778 | "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", 1779 | "optional": true, 1780 | "requires": { 1781 | "cliui": "^6.0.0", 1782 | "decamelize": "^1.2.0", 1783 | "find-up": "^4.1.0", 1784 | "get-caller-file": "^2.0.1", 1785 | "require-directory": "^2.1.1", 1786 | "require-main-filename": "^2.0.0", 1787 | "set-blocking": "^2.0.0", 1788 | "string-width": "^4.2.0", 1789 | "which-module": "^2.0.0", 1790 | "y18n": "^4.0.0", 1791 | "yargs-parser": "^18.1.2" 1792 | } 1793 | }, 1794 | "yargs-parser": { 1795 | "version": "18.1.3", 1796 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 1797 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 1798 | "optional": true, 1799 | "requires": { 1800 | "camelcase": "^5.0.0", 1801 | "decamelize": "^1.2.0" 1802 | } 1803 | }, 1804 | "yocto-queue": { 1805 | "version": "0.1.0", 1806 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1807 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1808 | "optional": true 1809 | } 1810 | } 1811 | } 1812 | -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "scripts": { 5 | "serve": "firebase emulators:start --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 | "engines": { 12 | "node": "12" 13 | }, 14 | "main": "index.js", 15 | "dependencies": { 16 | "firebase-admin": "^9.2.0", 17 | "firebase-functions": "^3.11.0" 18 | }, 19 | "devDependencies": { 20 | "firebase-functions-test": "^0.2.0" 21 | }, 22 | "private": true 23 | } 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase-security", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.11.6", 7 | "@testing-library/react": "^11.2.2", 8 | "@testing-library/user-event": "^12.2.2", 9 | "react": "^17.0.1", 10 | "react-dom": "^17.0.1", 11 | "react-scripts": "4.0.1", 12 | "web-vitals": "^0.2.4" 13 | }, 14 | "scripts": { 15 | "start": "react-scripts start", 16 | "build": "react-scripts build", 17 | "test": "jest --env=node --forceExit", 18 | "eject": "react-scripts eject" 19 | }, 20 | "eslintConfig": { 21 | "extends": [ 22 | "react-app", 23 | "react-app/jest" 24 | ] 25 | }, 26 | "browserslist": { 27 | "production": [ 28 | ">0.2%", 29 | "not dead", 30 | "not op_mini all" 31 | ], 32 | "development": [ 33 | "last 1 chrome version", 34 | "last 1 firefox version", 35 | "last 1 safari version" 36 | ] 37 | }, 38 | "devDependencies": { 39 | "@firebase/rules-unit-testing": "^1.1.3", 40 | "@firebase/testing": "^0.20.11", 41 | "firebase-admin": "^9.4.1", 42 | "jest": "^26.6.3" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fireship-io/firebase-security-course/84ee8cc95059081319753c11cc9c7497e5cc72a1/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 |
10 | Edit src/App.js
and save to reload.
11 |