├── .circleci └── config.yml ├── .firebase └── hosting.YnVpbGQ.cache ├── .firebaserc ├── .gitignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── firebase.json ├── firestore.indexes.json ├── firestore.rules ├── functions ├── copyVideoMetadata.js ├── index.js ├── package-lock.json ├── package.json ├── saveUser.js └── transcodeVideo.js ├── package.json ├── public ├── favicon.ico ├── index.html └── manifest.json ├── src ├── actions │ ├── asyncActions.js │ └── videoActions.js ├── components │ ├── App.jsx │ ├── AuthButton.jsx │ ├── AuthModal.jsx │ ├── Header.jsx │ ├── LoginForm.jsx │ ├── NavigationItem.jsx │ ├── SignUpForm.jsx │ ├── UserItem.jsx │ ├── VideoFeed.jsx │ ├── VideoPlayer.jsx │ └── VideoUpload.jsx ├── config │ └── firebase.js ├── constants │ └── actionTypes.js ├── containers │ ├── authContainer.jsx │ └── videosContainer.jsx ├── index.js ├── logo.svg ├── reducers │ ├── asyncReducer.js │ ├── index.js │ └── videoReducer.js ├── registerServiceWorker.js ├── store.js └── utils │ └── reducerUtil.js ├── storage.rules └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | build: 8 | docker: 9 | - image: circleci/node:8 10 | working_directory: ~/firebase-youtube-clone 11 | steps: 12 | - checkout 13 | - restore_cache: 14 | keys: 15 | - v1-dependencies-{{ checksum "package.json" }} 16 | # fallback to using the latest cache if no exact match is found 17 | - v1-dependencies- 18 | - run: npm install 19 | - run: 20 | name: 'Install Dependecies' 21 | command: npm install --save-dev firebase-tools 22 | - run: 23 | name: 'Build' 24 | command: npm run build 25 | - save_cache: 26 | paths: 27 | - node_modules 28 | key: v1-dependencies-{{ checksum "package.json" }} 29 | 30 | - persist_to_workspace: 31 | root: . 32 | paths: 33 | - . 34 | 35 | deploy: 36 | docker: 37 | - image: circleci/node:8 38 | working_directory: ~/firebase-youtube-clone 39 | steps: 40 | - attach_workspace: 41 | at: . 42 | - run: 43 | name: 'Deploy to Hosting' 44 | command: >- 45 | ln -s ./node_modules/firebase-tools/bin/firebase . && 46 | ./firebase deploy --only hosting --project "$FIREBASE_PROJECT_ID" --token "$FIREBASE_TOKEN" 47 | 48 | workflows: 49 | version: 2 50 | build_and_deploy: 51 | jobs: 52 | - build 53 | - deploy: 54 | requires: 55 | - build 56 | filters: 57 | branches: 58 | only: master -------------------------------------------------------------------------------- /.firebase/hosting.YnVpbGQ.cache: -------------------------------------------------------------------------------- 1 | asset-manifest.json,1547918862397,fdb1f98fc61df27c2ef68897bc8005719c69dfdff3eda53a9337b9d03a1aaf1e 2 | favicon.ico,1547049753462,b72f7455f00e4e58792d2bca892abb068e2213838c0316d6b7a0d6d16acd1955 3 | precache-manifest.4bd5c5267f34f8d7f77f0dcaa445a1e5.js,1547918862397,ccb2a53cee996bce5afb7a498dea0f0fc4841e53bba8107cad4771d956624091 4 | index.html,1547918862397,b8728b0ab77bc1a2bc97445bf694ae0e25b16400aeb8bed9571b67163693b6bd 5 | service-worker.js,1547918862397,d9f66afeab31cda1b35e88beaad57d05e17484f289f929fe20f7f670bb76c5dc 6 | static/js/main.57f7c179.chunk.js,1547918862397,4ced98b05664daa722237fafc9a34e426b39198e6d31b125852f746b229d2c86 7 | static/css/1.6a5c57af.chunk.css,1547918862398,238a9c4ee3e9315ea70aaec23d2bf84afc5a942d2631619fb42ccfa24e30f847 8 | static/js/runtime~main.229c360f.js,1547918862442,dbe189fe130313d04dc42edcaa021db9317ce6d58c07ab66fe538fdfe41fe6d7 9 | static/js/runtime~main.229c360f.js.map,1547918862442,b2f1f5578e572791ed8967e3d0090b7eb2ec5f9d87d1bd433d4d7ffdb5d15f5e 10 | manifest.json,1547049753462,5fb9316df9fcb631af8259f9a91b476804b4d68258e1c4144017c018f2b63aa3 11 | static/css/1.6a5c57af.chunk.css.map,1547918862442,7d05d41b107ff9f696a169f6d9fc8700a5217292266a1299db7bf6f22e86e916 12 | static/js/main.57f7c179.chunk.js.map,1547918862442,57c7fcd623cfba49484878ddbd564cdd37c7c93545b732af9c41e611dab53b08 13 | static/js/1.4ebb6944.chunk.js,1547918862444,f24ea5d58d9e18c93971c42b1c5dc1c512fd4c87d5c12634640d9f1641c46d16 14 | static/js/1.4ebb6944.chunk.js.map,1547918862443,58bbddbafbdbea4001480400a12839ed35e84ea9c6ca89d346b50acb3bbc0658 15 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "fir-clone-1a266" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | 23 | # firebase 24 | functions/config/service_account.json 25 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // IntelliSense を使用して利用可能な属性を学べます。 3 | // 既存の属性の説明をホバーして表示します。 4 | // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "chrome", 9 | "request": "launch", 10 | "name": "Launch Chrome against localhost", 11 | "url": "http://localhost:8080", 12 | "webRoot": "${workspaceFolder}" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Yuichi Kojima 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Firebase YouTube Clone 2 | - 技術書典5 で出典した書籍のサンプルアプリケーションです。 3 | 4 | [Demo App](https://fir-clone-1a266.firebaseapp.com/) 5 | 6 | ## ブランチ構成 7 | 8 | ### master 9 | 10 | - 書籍を最後まで進めた場合の実装となります。 11 | 12 | ### chapter[num]_xxx 13 | 14 | - `chapter数字`と続くブランチは、各章ごとまでの実装となります。 15 | 16 | ### develop 17 | 18 | - 書籍では、含められなかった内容や機能追加など現在進行系で開発中のブランチです。 19 | 20 | ## 追加機能 21 | 22 | - [CircleCI の導入](https://github.com/samuraikun/firebase-youtube-clone/pull/6) 23 | - [認証完了時に Cloud Functions 経由で、ユーザー情報を保存する & Firestore のセキュリティルール変更](https://github.com/samuraikun/firebase-youtube-clone/pull/8) 24 | - [DB設計の変更](https://github.com/samuraikun/firebase-youtube-clone/pull/9) 25 | - [ユーザー認証の機能追加](https://github.com/samuraikun/firebase-youtube-clone/pull/10) 26 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "firestore": { 3 | "rules": "firestore.rules", 4 | "indexes": "firestore.indexes.json" 5 | }, 6 | "hosting": { 7 | "public": "build", 8 | "ignore": [ 9 | "firebase.json", 10 | "**/.*", 11 | "**/node_modules/**" 12 | ] 13 | }, 14 | "storage": { 15 | "rules": "storage.rules" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | // Example: 3 | // 4 | // "indexes": [ 5 | // { 6 | // "collectionId": "widgets", 7 | // "fields": [ 8 | // { "fieldPath": "foo", "mode": "ASCENDING" }, 9 | // { "fieldPath": "bar", "mode": "DESCENDING" } 10 | // ] 11 | // } 12 | // ] 13 | "indexes": [] 14 | } -------------------------------------------------------------------------------- /firestore.rules: -------------------------------------------------------------------------------- 1 | service cloud.firestore { 2 | match /databases/{database}/documents { 3 | function auth() { 4 | return request.auth; 5 | } 6 | 7 | function isAuthenticated() { 8 | return auth().uid != null; 9 | } 10 | 11 | function isUserAuthenticated(userId) { 12 | return auth().uid == userId; 13 | } 14 | 15 | function isAdmin() { 16 | return exists(/databases/$(database)/documents/admins/$(auth().uid)); 17 | } 18 | 19 | match /users/{userId} { 20 | allow get: if isAuthenticated(); 21 | allow create, update, delete: if isUserAuthenticated(userId) || isAdmin(); 22 | 23 | match /videos/{videoId} { 24 | allow read: if isAuthenticated(); 25 | allow create, update, delete: if isUserAuthenticated(userId) || isAdmin(); 26 | } 27 | } 28 | 29 | match /videos/{video} { 30 | allow read: if isAuthenticated(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /functions/copyVideoMetadata.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | const serviceAccount = require('./config/service_account.json'); 3 | const admin = require('firebase-admin'); 4 | try { 5 | admin.initializeApp({ 6 | credential: admin.credential.cert(serviceAccount), 7 | databaseURL: "https://fir-reacty-videos.firebaseio.com" 8 | }); 9 | admin.firestore().settings({timestampsInSnapshots: true}); 10 | } catch (error) { 11 | console.log(error); 12 | } 13 | const firestore = admin.firestore(); 14 | 15 | exports.onUsersVideoCreate = functions.firestore.document('users/{userId}/videos/{videoId}').onCreate(async (snapshot, context) => { 16 | await copyToRootWithUsersVideoSnapshot(snapshot, context); 17 | }); 18 | 19 | exports.onUsersVideoUpdate = functions.firestore.document('users/{userId}/videos/{videoId}').onUpdate(async (change, context) => { 20 | await copyToRootWithUsersVideoSnapshot(change.after, context); 21 | }); 22 | 23 | async function copyToRootWithUsersVideoSnapshot(snapshot, context) { 24 | const userId = context.params.userId; 25 | const videoId = context.params.videoId; 26 | const video = snapshot.data(); 27 | video.userRef = firestore.collection('users').doc(userId); 28 | 29 | await firestore.collection('videos').doc(videoId).set(video, { merge: true }); 30 | } -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Triggers when a user upload video file, video is transcoded mp4. 3 | */ 4 | if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'transcodeVideo') { 5 | exports.transcodeVideo = require('./transcodeVideo').transcodeVideo; 6 | } 7 | 8 | /* 9 | * Triggers when was created new user, user account is saved Firestore. 10 | */ 11 | if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'saveUser') { 12 | exports.saveUser = require('./saveUser').saveUser; 13 | } 14 | 15 | /* 16 | * Triggers when was created new video data, video data is copied Firestore 17 | */ 18 | if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'onUsersVideoCreate') { 19 | exports.onUsersVideoCreate = require('./copyVideoMetadata').onUsersVideoCreate; 20 | } 21 | 22 | /* 23 | * Triggers when was updated new video data, video data is copied Firestore 24 | */ 25 | if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'onUsersVideoUpdate') { 26 | exports.onUsersVideoUpdate = require('./copyVideoMetadata').onUsersVideoUpdate; 27 | } 28 | -------------------------------------------------------------------------------- /functions/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@firebase/app": { 7 | "version": "0.3.4", 8 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.4.tgz", 9 | "integrity": "sha512-Q6sNpWZ3x+FeuBkLCCRrsOraGJOKVLUCc9Amj8zu2vAC1v2uWifRR6kZ60TrpaIxtY4N6pcPTaG0YIUT5lgeSA==", 10 | "requires": { 11 | "@firebase/app-types": "0.3.2", 12 | "@firebase/util": "0.2.2", 13 | "dom-storage": "2.1.0", 14 | "tslib": "1.9.0", 15 | "xmlhttprequest": "1.8.0" 16 | } 17 | }, 18 | "@firebase/app-types": { 19 | "version": "0.3.2", 20 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.2.tgz", 21 | "integrity": "sha512-ZD8lTgW07NGgo75bTyBJA8Lt9+NweNzot7lrsBtIvfciwUzaFJLsv2EShqjBeuhF7RpG6YFucJ6m67w5buCtzw==" 22 | }, 23 | "@firebase/database": { 24 | "version": "0.3.6", 25 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.6.tgz", 26 | "integrity": "sha512-r02JOqTLcd2/qn7QkkJvIAxMiMxmeyd5B76kl9hHAs+3cil5mUzHnI3svtb4h0VIJYDHFKJMlVl/bE3GfcTR3A==", 27 | "requires": { 28 | "@firebase/database-types": "0.3.2", 29 | "@firebase/logger": "0.1.1", 30 | "@firebase/util": "0.2.2", 31 | "faye-websocket": "0.11.1", 32 | "tslib": "1.9.0" 33 | } 34 | }, 35 | "@firebase/database-types": { 36 | "version": "0.3.2", 37 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.2.tgz", 38 | "integrity": "sha512-9ZYdvYQ6r3aaHJarhUM5Hf6lQWu3ZJme+RR0o8qfBb9L04TL3uNjt+AJFku1ysVPntTn+9GqJjiIB2/OC3JtwA==" 39 | }, 40 | "@firebase/logger": { 41 | "version": "0.1.1", 42 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.1.tgz", 43 | "integrity": "sha512-5jn3HHbEfdOwychyIEIkP1cik+MW/vvoOavTOzwDkH+fv6Bx+HBUOzh09M7sCYzXFtKzjbUax9+g39mJNBLklQ==" 44 | }, 45 | "@firebase/util": { 46 | "version": "0.2.2", 47 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.2.tgz", 48 | "integrity": "sha512-vfRjmCWuxtJx3txHocaNlDwCDwwv6KLL5YtlSNi73wBdvF3UfnpLGrth7G3X6gn5rDhOKamRg2+9L8cfsjSS1A==", 49 | "requires": { 50 | "tslib": "1.9.0" 51 | } 52 | }, 53 | "@google-cloud/common": { 54 | "version": "0.24.0", 55 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.24.0.tgz", 56 | "integrity": "sha512-VEOVppG2UkDznmFiIWdH6zzV/gU6ximYqiSoxo/+bSgC/vAGKp3cPMxGuwB0qVgmqxvtl6RR4KtygxzP/tWbng==", 57 | "requires": { 58 | "@google-cloud/projectify": "^0.3.0", 59 | "@google-cloud/promisify": "^0.3.0", 60 | "@types/duplexify": "^3.5.0", 61 | "@types/request": "^2.47.0", 62 | "arrify": "^1.0.1", 63 | "duplexify": "^3.6.0", 64 | "ent": "^2.2.0", 65 | "extend": "^3.0.1", 66 | "google-auth-library": "^2.0.0", 67 | "is": "^3.2.1", 68 | "pify": "^4.0.0", 69 | "retry-request": "^4.0.0", 70 | "through2": "^2.0.3" 71 | }, 72 | "dependencies": { 73 | "gcp-metadata": { 74 | "version": "0.7.0", 75 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz", 76 | "integrity": "sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g==", 77 | "requires": { 78 | "axios": "^0.18.0", 79 | "extend": "^3.0.1", 80 | "retry-axios": "0.3.2" 81 | } 82 | }, 83 | "google-auth-library": { 84 | "version": "2.0.0", 85 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.0.tgz", 86 | "integrity": "sha512-lN6jecH8L30uAirTeOm9ij9CTMJniwg7fbuyOpgH4lFkO50LKhPrx/ZbLGK8aBCzi/u4/tpdZnJABFuMqtIx0A==", 87 | "requires": { 88 | "axios": "^0.18.0", 89 | "gcp-metadata": "^0.7.0", 90 | "gtoken": "^2.3.0", 91 | "https-proxy-agent": "^2.2.1", 92 | "jws": "^3.1.5", 93 | "lodash.isstring": "^4.0.1", 94 | "lru-cache": "^4.1.3", 95 | "semver": "^5.5.0" 96 | } 97 | }, 98 | "pify": { 99 | "version": "4.0.0", 100 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.0.tgz", 101 | "integrity": "sha512-zrSP/KDf9DH3K3VePONoCstgPiYJy9z0SCatZuTpOc7YdnWIqwkWdXOuwlr4uDc7em8QZRsFWsT/685x5InjYg==" 102 | } 103 | } 104 | }, 105 | "@google-cloud/firestore": { 106 | "version": "0.16.1", 107 | "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.16.1.tgz", 108 | "integrity": "sha512-xHb4OdRb0OP0x/8w58WJERtCi9Pr+CsloiUlVAq6fFjSyEcmxgL0V+swE8A/2rI5NGQGwtrN57xwDcis5UM/cQ==", 109 | "optional": true, 110 | "requires": { 111 | "@google-cloud/projectify": "^0.3.0", 112 | "bun": "^0.0.12", 113 | "deep-equal": "^1.0.1", 114 | "extend": "^3.0.1", 115 | "functional-red-black-tree": "^1.0.1", 116 | "google-gax": "^0.18.0", 117 | "google-proto-files": "^0.16.1", 118 | "is": "^3.2.1", 119 | "lodash.merge": "^4.6.1", 120 | "protobufjs": "^6.8.6", 121 | "through2": "^2.0.3" 122 | } 123 | }, 124 | "@google-cloud/paginator": { 125 | "version": "0.1.1", 126 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-0.1.1.tgz", 127 | "integrity": "sha512-IOafoUT1nLnTiDMrwqqHLul6FxoAxkB4WmjbLhMY5+chwg8tfcDgRRNNCvg00lEHnhVTu3ESs1Zue7WwM6NJYQ==", 128 | "requires": { 129 | "arrify": "^1.0.1", 130 | "extend": "^3.0.1", 131 | "is": "^3.2.1", 132 | "split-array-stream": "^2.0.0", 133 | "stream-events": "^1.0.4" 134 | } 135 | }, 136 | "@google-cloud/projectify": { 137 | "version": "0.3.0", 138 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.0.tgz", 139 | "integrity": "sha512-ic3vU+rBLlQ9rU6vyMcQ/GoYQX9hP0P56jdbnSkGvXrVnO1DtYrkPV3Qg/NUrpAfKnmNC4hb0O/v2hCj8uGnbQ==" 140 | }, 141 | "@google-cloud/promisify": { 142 | "version": "0.3.1", 143 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz", 144 | "integrity": "sha512-QzB0/IMvB0eFxFK7Eqh+bfC8NLv3E9ScjWQrPOk6GgfNroxcVITdTlT8NRsRrcp5+QQJVPLkRqKG0PUdaWXmHw==" 145 | }, 146 | "@google-cloud/storage": { 147 | "version": "2.0.3", 148 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-2.0.3.tgz", 149 | "integrity": "sha512-wNqoE4t43xLmoTraKiTUuDKq1zS713XvQ4guvAJyNoxukhj6aKcmLwY6t2Os000SYYGLipG2jXccmVfU/U776w==", 150 | "requires": { 151 | "@google-cloud/common": "^0.24.0", 152 | "@google-cloud/paginator": "^0.1.0", 153 | "@google-cloud/promisify": "^0.3.0", 154 | "arrify": "^1.0.0", 155 | "async": "^2.0.1", 156 | "compressible": "^2.0.12", 157 | "concat-stream": "^1.5.0", 158 | "duplexify": "^3.5.0", 159 | "extend": "^3.0.0", 160 | "gcs-resumable-upload": "^0.13.0", 161 | "hash-stream-validation": "^0.2.1", 162 | "is": "^3.0.1", 163 | "mime": "^2.2.0", 164 | "mime-types": "^2.0.8", 165 | "once": "^1.3.1", 166 | "pumpify": "^1.5.1", 167 | "request": "^2.88.0", 168 | "snakeize": "^0.1.0", 169 | "stream-events": "^1.0.1", 170 | "through2": "^2.0.0", 171 | "xdg-basedir": "^3.0.0" 172 | } 173 | }, 174 | "@grpc/proto-loader": { 175 | "version": "0.3.0", 176 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.3.0.tgz", 177 | "integrity": "sha512-9b8S/V+3W4Gv7G/JKSZ48zApgyYbfIR7mAC9XNnaSWme3zj57MIESu0ELzm9j5oxNIpFG8DgO00iJMIUZ5luqw==", 178 | "optional": true, 179 | "requires": { 180 | "@types/lodash": "^4.14.104", 181 | "@types/node": "^9.4.6", 182 | "lodash": "^4.17.5", 183 | "protobufjs": "^6.8.6" 184 | }, 185 | "dependencies": { 186 | "@types/node": { 187 | "version": "9.6.32", 188 | "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.32.tgz", 189 | "integrity": "sha512-5+L3wQ+FHoQ589EaH6rYICleuj8gnunq+1CJkM9fxklirErIOv+kxm3s/vecYnpJOYnFowE5uUizcb3hgjHUug==", 190 | "optional": true 191 | } 192 | } 193 | }, 194 | "@mrmlnc/readdir-enhanced": { 195 | "version": "2.2.1", 196 | "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", 197 | "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", 198 | "requires": { 199 | "call-me-maybe": "^1.0.1", 200 | "glob-to-regexp": "^0.3.0" 201 | } 202 | }, 203 | "@nodelib/fs.stat": { 204 | "version": "1.1.2", 205 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz", 206 | "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==" 207 | }, 208 | "@protobufjs/aspromise": { 209 | "version": "1.1.2", 210 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 211 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 212 | }, 213 | "@protobufjs/base64": { 214 | "version": "1.1.2", 215 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 216 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 217 | }, 218 | "@protobufjs/codegen": { 219 | "version": "2.0.4", 220 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 221 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 222 | }, 223 | "@protobufjs/eventemitter": { 224 | "version": "1.1.0", 225 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 226 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 227 | }, 228 | "@protobufjs/fetch": { 229 | "version": "1.1.0", 230 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 231 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 232 | "requires": { 233 | "@protobufjs/aspromise": "^1.1.1", 234 | "@protobufjs/inquire": "^1.1.0" 235 | } 236 | }, 237 | "@protobufjs/float": { 238 | "version": "1.0.2", 239 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 240 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 241 | }, 242 | "@protobufjs/inquire": { 243 | "version": "1.1.0", 244 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 245 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 246 | }, 247 | "@protobufjs/path": { 248 | "version": "1.1.2", 249 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 250 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 251 | }, 252 | "@protobufjs/pool": { 253 | "version": "1.1.0", 254 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 255 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 256 | }, 257 | "@protobufjs/utf8": { 258 | "version": "1.1.0", 259 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 260 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 261 | }, 262 | "@types/body-parser": { 263 | "version": "1.17.0", 264 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", 265 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", 266 | "requires": { 267 | "@types/connect": "*", 268 | "@types/node": "*" 269 | } 270 | }, 271 | "@types/caseless": { 272 | "version": "0.12.1", 273 | "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", 274 | "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==" 275 | }, 276 | "@types/connect": { 277 | "version": "3.4.32", 278 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", 279 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", 280 | "requires": { 281 | "@types/node": "*" 282 | } 283 | }, 284 | "@types/cors": { 285 | "version": "2.8.4", 286 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.4.tgz", 287 | "integrity": "sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw==", 288 | "requires": { 289 | "@types/express": "*" 290 | } 291 | }, 292 | "@types/duplexify": { 293 | "version": "3.5.0", 294 | "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.5.0.tgz", 295 | "integrity": "sha512-+aZCCdxuR/Q6n58CBkXyqGqimIqpYUcFLfBXagXv7e9TdJUevqkKhzopBuRz3RB064sQxnJnhttHOkK/O93Ouw==", 296 | "requires": { 297 | "@types/node": "*" 298 | } 299 | }, 300 | "@types/events": { 301 | "version": "1.2.0", 302 | "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", 303 | "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" 304 | }, 305 | "@types/express": { 306 | "version": "4.16.0", 307 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", 308 | "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", 309 | "requires": { 310 | "@types/body-parser": "*", 311 | "@types/express-serve-static-core": "*", 312 | "@types/serve-static": "*" 313 | } 314 | }, 315 | "@types/express-serve-static-core": { 316 | "version": "4.16.0", 317 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", 318 | "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", 319 | "requires": { 320 | "@types/events": "*", 321 | "@types/node": "*", 322 | "@types/range-parser": "*" 323 | } 324 | }, 325 | "@types/form-data": { 326 | "version": "2.2.1", 327 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", 328 | "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", 329 | "requires": { 330 | "@types/node": "*" 331 | } 332 | }, 333 | "@types/google-cloud__storage": { 334 | "version": "1.7.2", 335 | "resolved": "https://registry.npmjs.org/@types/google-cloud__storage/-/google-cloud__storage-1.7.2.tgz", 336 | "integrity": "sha512-RaQJ7+Ht20MRYJu7mgKBpbVNZIPneztKIl/DUKacRC6A8mXRsJfgDdPA7indHmJGIgm+hzUTj44+A3RyuuYZhg==", 337 | "optional": true, 338 | "requires": { 339 | "@types/node": "*", 340 | "@types/request": "*" 341 | } 342 | }, 343 | "@types/jsonwebtoken": { 344 | "version": "7.2.8", 345 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz", 346 | "integrity": "sha512-XENN3YzEB8D6TiUww0O8SRznzy1v+77lH7UmuN54xq/IHIsyWjWOzZuFFTtoiRuaE782uAoRwBe/wwow+vQXZw==", 347 | "requires": { 348 | "@types/node": "*" 349 | } 350 | }, 351 | "@types/lodash": { 352 | "version": "4.14.116", 353 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", 354 | "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==" 355 | }, 356 | "@types/long": { 357 | "version": "4.0.0", 358 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 359 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 360 | }, 361 | "@types/mime": { 362 | "version": "2.0.0", 363 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", 364 | "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" 365 | }, 366 | "@types/node": { 367 | "version": "8.10.30", 368 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.30.tgz", 369 | "integrity": "sha512-Le8HGMI5gjFSBqcCuKP/wfHC19oURzkU2D+ERIescUoJd+CmNEMYBib9LQ4zj1HHEZOJQWhw2ZTnbD8weASh/Q==" 370 | }, 371 | "@types/range-parser": { 372 | "version": "1.2.2", 373 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz", 374 | "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==" 375 | }, 376 | "@types/request": { 377 | "version": "2.47.1", 378 | "resolved": "https://registry.npmjs.org/@types/request/-/request-2.47.1.tgz", 379 | "integrity": "sha512-TV3XLvDjQbIeVxJ1Z3oCTDk/KuYwwcNKVwz2YaT0F5u86Prgc4syDAp6P96rkTQQ4bIdh+VswQIC9zS6NjY7/g==", 380 | "requires": { 381 | "@types/caseless": "*", 382 | "@types/form-data": "*", 383 | "@types/node": "*", 384 | "@types/tough-cookie": "*" 385 | } 386 | }, 387 | "@types/serve-static": { 388 | "version": "1.13.2", 389 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", 390 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", 391 | "requires": { 392 | "@types/express-serve-static-core": "*", 393 | "@types/mime": "*" 394 | } 395 | }, 396 | "@types/tough-cookie": { 397 | "version": "2.3.3", 398 | "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", 399 | "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==" 400 | }, 401 | "accepts": { 402 | "version": "1.3.5", 403 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 404 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 405 | "requires": { 406 | "mime-types": "~2.1.18", 407 | "negotiator": "0.6.1" 408 | } 409 | }, 410 | "acorn": { 411 | "version": "5.7.3", 412 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 413 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" 414 | }, 415 | "acorn-es7-plugin": { 416 | "version": "1.1.7", 417 | "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", 418 | "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=" 419 | }, 420 | "agent-base": { 421 | "version": "4.2.1", 422 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", 423 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", 424 | "requires": { 425 | "es6-promisify": "^5.0.0" 426 | } 427 | }, 428 | "ajv": { 429 | "version": "5.5.2", 430 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 431 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 432 | "requires": { 433 | "co": "^4.6.0", 434 | "fast-deep-equal": "^1.0.0", 435 | "fast-json-stable-stringify": "^2.0.0", 436 | "json-schema-traverse": "^0.3.0" 437 | } 438 | }, 439 | "ansi-regex": { 440 | "version": "2.1.1", 441 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 442 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 443 | }, 444 | "arr-diff": { 445 | "version": "4.0.0", 446 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 447 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 448 | }, 449 | "arr-flatten": { 450 | "version": "1.1.0", 451 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 452 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 453 | }, 454 | "arr-union": { 455 | "version": "3.1.0", 456 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 457 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 458 | }, 459 | "array-filter": { 460 | "version": "1.0.0", 461 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", 462 | "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" 463 | }, 464 | "array-flatten": { 465 | "version": "1.1.1", 466 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 467 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 468 | }, 469 | "array-union": { 470 | "version": "1.0.2", 471 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 472 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 473 | "requires": { 474 | "array-uniq": "^1.0.1" 475 | } 476 | }, 477 | "array-uniq": { 478 | "version": "1.0.3", 479 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 480 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 481 | }, 482 | "array-unique": { 483 | "version": "0.3.2", 484 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 485 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 486 | }, 487 | "arrify": { 488 | "version": "1.0.1", 489 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 490 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 491 | }, 492 | "ascli": { 493 | "version": "1.0.1", 494 | "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", 495 | "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", 496 | "optional": true, 497 | "requires": { 498 | "colour": "~0.7.1", 499 | "optjs": "~3.2.2" 500 | } 501 | }, 502 | "asn1": { 503 | "version": "0.2.4", 504 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 505 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 506 | "requires": { 507 | "safer-buffer": "~2.1.0" 508 | } 509 | }, 510 | "assert-plus": { 511 | "version": "1.0.0", 512 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 513 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 514 | }, 515 | "assign-symbols": { 516 | "version": "1.0.0", 517 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 518 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 519 | }, 520 | "async": { 521 | "version": "2.6.1", 522 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 523 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 524 | "requires": { 525 | "lodash": "^4.17.10" 526 | } 527 | }, 528 | "asynckit": { 529 | "version": "0.4.0", 530 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 531 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 532 | }, 533 | "atob": { 534 | "version": "2.1.2", 535 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 536 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" 537 | }, 538 | "aws-sign2": { 539 | "version": "0.7.0", 540 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 541 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 542 | }, 543 | "aws4": { 544 | "version": "1.8.0", 545 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 546 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 547 | }, 548 | "axios": { 549 | "version": "0.18.0", 550 | "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", 551 | "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", 552 | "requires": { 553 | "follow-redirects": "^1.3.0", 554 | "is-buffer": "^1.1.5" 555 | } 556 | }, 557 | "balanced-match": { 558 | "version": "1.0.0", 559 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 560 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 561 | }, 562 | "base": { 563 | "version": "0.11.2", 564 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 565 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 566 | "requires": { 567 | "cache-base": "^1.0.1", 568 | "class-utils": "^0.3.5", 569 | "component-emitter": "^1.2.1", 570 | "define-property": "^1.0.0", 571 | "isobject": "^3.0.1", 572 | "mixin-deep": "^1.2.0", 573 | "pascalcase": "^0.1.1" 574 | }, 575 | "dependencies": { 576 | "define-property": { 577 | "version": "1.0.0", 578 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 579 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 580 | "requires": { 581 | "is-descriptor": "^1.0.0" 582 | } 583 | }, 584 | "is-accessor-descriptor": { 585 | "version": "1.0.0", 586 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 587 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 588 | "requires": { 589 | "kind-of": "^6.0.0" 590 | } 591 | }, 592 | "is-data-descriptor": { 593 | "version": "1.0.0", 594 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 595 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 596 | "requires": { 597 | "kind-of": "^6.0.0" 598 | } 599 | }, 600 | "is-descriptor": { 601 | "version": "1.0.2", 602 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 603 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 604 | "requires": { 605 | "is-accessor-descriptor": "^1.0.0", 606 | "is-data-descriptor": "^1.0.0", 607 | "kind-of": "^6.0.2" 608 | } 609 | } 610 | } 611 | }, 612 | "bcrypt-pbkdf": { 613 | "version": "1.0.2", 614 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 615 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 616 | "optional": true, 617 | "requires": { 618 | "tweetnacl": "^0.14.3" 619 | } 620 | }, 621 | "body-parser": { 622 | "version": "1.18.2", 623 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 624 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 625 | "requires": { 626 | "bytes": "3.0.0", 627 | "content-type": "~1.0.4", 628 | "debug": "2.6.9", 629 | "depd": "~1.1.1", 630 | "http-errors": "~1.6.2", 631 | "iconv-lite": "0.4.19", 632 | "on-finished": "~2.3.0", 633 | "qs": "6.5.1", 634 | "raw-body": "2.3.2", 635 | "type-is": "~1.6.15" 636 | }, 637 | "dependencies": { 638 | "qs": { 639 | "version": "6.5.1", 640 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 641 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 642 | } 643 | } 644 | }, 645 | "brace-expansion": { 646 | "version": "1.1.11", 647 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 648 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 649 | "requires": { 650 | "balanced-match": "^1.0.0", 651 | "concat-map": "0.0.1" 652 | } 653 | }, 654 | "braces": { 655 | "version": "2.3.2", 656 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 657 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 658 | "requires": { 659 | "arr-flatten": "^1.1.0", 660 | "array-unique": "^0.3.2", 661 | "extend-shallow": "^2.0.1", 662 | "fill-range": "^4.0.0", 663 | "isobject": "^3.0.1", 664 | "repeat-element": "^1.1.2", 665 | "snapdragon": "^0.8.1", 666 | "snapdragon-node": "^2.0.1", 667 | "split-string": "^3.0.2", 668 | "to-regex": "^3.0.1" 669 | }, 670 | "dependencies": { 671 | "extend-shallow": { 672 | "version": "2.0.1", 673 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 674 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 675 | "requires": { 676 | "is-extendable": "^0.1.0" 677 | } 678 | } 679 | } 680 | }, 681 | "buffer-equal-constant-time": { 682 | "version": "1.0.1", 683 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 684 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 685 | }, 686 | "buffer-from": { 687 | "version": "1.1.1", 688 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 689 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 690 | }, 691 | "bun": { 692 | "version": "0.0.12", 693 | "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", 694 | "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", 695 | "optional": true, 696 | "requires": { 697 | "readable-stream": "~1.0.32" 698 | } 699 | }, 700 | "bytebuffer": { 701 | "version": "5.0.1", 702 | "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", 703 | "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", 704 | "optional": true, 705 | "requires": { 706 | "long": "~3" 707 | }, 708 | "dependencies": { 709 | "long": { 710 | "version": "3.2.0", 711 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 712 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", 713 | "optional": true 714 | } 715 | } 716 | }, 717 | "bytes": { 718 | "version": "3.0.0", 719 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 720 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 721 | }, 722 | "cache-base": { 723 | "version": "1.0.1", 724 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 725 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 726 | "requires": { 727 | "collection-visit": "^1.0.0", 728 | "component-emitter": "^1.2.1", 729 | "get-value": "^2.0.6", 730 | "has-value": "^1.0.0", 731 | "isobject": "^3.0.1", 732 | "set-value": "^2.0.0", 733 | "to-object-path": "^0.3.0", 734 | "union-value": "^1.0.0", 735 | "unset-value": "^1.0.0" 736 | } 737 | }, 738 | "call-me-maybe": { 739 | "version": "1.0.1", 740 | "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", 741 | "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" 742 | }, 743 | "call-signature": { 744 | "version": "0.0.2", 745 | "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", 746 | "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=" 747 | }, 748 | "camelcase": { 749 | "version": "2.1.1", 750 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 751 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 752 | "optional": true 753 | }, 754 | "capture-stack-trace": { 755 | "version": "1.0.1", 756 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 757 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" 758 | }, 759 | "caseless": { 760 | "version": "0.12.0", 761 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 762 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 763 | }, 764 | "class-utils": { 765 | "version": "0.3.6", 766 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 767 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 768 | "requires": { 769 | "arr-union": "^3.1.0", 770 | "define-property": "^0.2.5", 771 | "isobject": "^3.0.0", 772 | "static-extend": "^0.1.1" 773 | }, 774 | "dependencies": { 775 | "define-property": { 776 | "version": "0.2.5", 777 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 778 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 779 | "requires": { 780 | "is-descriptor": "^0.1.0" 781 | } 782 | } 783 | } 784 | }, 785 | "cliui": { 786 | "version": "3.2.0", 787 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 788 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 789 | "optional": true, 790 | "requires": { 791 | "string-width": "^1.0.1", 792 | "strip-ansi": "^3.0.1", 793 | "wrap-ansi": "^2.0.0" 794 | } 795 | }, 796 | "co": { 797 | "version": "4.6.0", 798 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 799 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 800 | }, 801 | "code-point-at": { 802 | "version": "1.1.0", 803 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 804 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 805 | }, 806 | "collection-visit": { 807 | "version": "1.0.0", 808 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 809 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 810 | "requires": { 811 | "map-visit": "^1.0.0", 812 | "object-visit": "^1.0.0" 813 | } 814 | }, 815 | "colour": { 816 | "version": "0.7.1", 817 | "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", 818 | "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", 819 | "optional": true 820 | }, 821 | "combined-stream": { 822 | "version": "1.0.7", 823 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 824 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 825 | "requires": { 826 | "delayed-stream": "~1.0.0" 827 | } 828 | }, 829 | "component-emitter": { 830 | "version": "1.2.1", 831 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 832 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 833 | }, 834 | "compressible": { 835 | "version": "2.0.15", 836 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", 837 | "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", 838 | "requires": { 839 | "mime-db": ">= 1.36.0 < 2" 840 | } 841 | }, 842 | "concat-map": { 843 | "version": "0.0.1", 844 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 845 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 846 | }, 847 | "concat-stream": { 848 | "version": "1.6.2", 849 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 850 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 851 | "requires": { 852 | "buffer-from": "^1.0.0", 853 | "inherits": "^2.0.3", 854 | "readable-stream": "^2.2.2", 855 | "typedarray": "^0.0.6" 856 | }, 857 | "dependencies": { 858 | "isarray": { 859 | "version": "1.0.0", 860 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 861 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 862 | }, 863 | "readable-stream": { 864 | "version": "2.3.6", 865 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 866 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 867 | "requires": { 868 | "core-util-is": "~1.0.0", 869 | "inherits": "~2.0.3", 870 | "isarray": "~1.0.0", 871 | "process-nextick-args": "~2.0.0", 872 | "safe-buffer": "~5.1.1", 873 | "string_decoder": "~1.1.1", 874 | "util-deprecate": "~1.0.1" 875 | } 876 | }, 877 | "string_decoder": { 878 | "version": "1.1.1", 879 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 880 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 881 | "requires": { 882 | "safe-buffer": "~5.1.0" 883 | } 884 | } 885 | } 886 | }, 887 | "configstore": { 888 | "version": "4.0.0", 889 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", 890 | "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", 891 | "requires": { 892 | "dot-prop": "^4.1.0", 893 | "graceful-fs": "^4.1.2", 894 | "make-dir": "^1.0.0", 895 | "unique-string": "^1.0.0", 896 | "write-file-atomic": "^2.0.0", 897 | "xdg-basedir": "^3.0.0" 898 | } 899 | }, 900 | "content-disposition": { 901 | "version": "0.5.2", 902 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 903 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 904 | }, 905 | "content-type": { 906 | "version": "1.0.4", 907 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 908 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 909 | }, 910 | "cookie": { 911 | "version": "0.3.1", 912 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 913 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 914 | }, 915 | "cookie-signature": { 916 | "version": "1.0.6", 917 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 918 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 919 | }, 920 | "copy-descriptor": { 921 | "version": "0.1.1", 922 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 923 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 924 | }, 925 | "core-js": { 926 | "version": "2.5.7", 927 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", 928 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" 929 | }, 930 | "core-util-is": { 931 | "version": "1.0.2", 932 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 933 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 934 | }, 935 | "cors": { 936 | "version": "2.8.4", 937 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", 938 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", 939 | "requires": { 940 | "object-assign": "^4", 941 | "vary": "^1" 942 | } 943 | }, 944 | "create-error-class": { 945 | "version": "3.0.2", 946 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 947 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 948 | "requires": { 949 | "capture-stack-trace": "^1.0.0" 950 | } 951 | }, 952 | "crypto-random-string": { 953 | "version": "1.0.0", 954 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 955 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 956 | }, 957 | "dashdash": { 958 | "version": "1.14.1", 959 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 960 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 961 | "requires": { 962 | "assert-plus": "^1.0.0" 963 | } 964 | }, 965 | "debug": { 966 | "version": "2.6.9", 967 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 968 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 969 | "requires": { 970 | "ms": "2.0.0" 971 | } 972 | }, 973 | "decamelize": { 974 | "version": "1.2.0", 975 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 976 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 977 | "optional": true 978 | }, 979 | "decode-uri-component": { 980 | "version": "0.2.0", 981 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 982 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 983 | }, 984 | "deep-equal": { 985 | "version": "1.0.1", 986 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 987 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 988 | "optional": true 989 | }, 990 | "define-properties": { 991 | "version": "1.1.3", 992 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 993 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 994 | "requires": { 995 | "object-keys": "^1.0.12" 996 | } 997 | }, 998 | "define-property": { 999 | "version": "2.0.2", 1000 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 1001 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 1002 | "requires": { 1003 | "is-descriptor": "^1.0.2", 1004 | "isobject": "^3.0.1" 1005 | }, 1006 | "dependencies": { 1007 | "is-accessor-descriptor": { 1008 | "version": "1.0.0", 1009 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1010 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1011 | "requires": { 1012 | "kind-of": "^6.0.0" 1013 | } 1014 | }, 1015 | "is-data-descriptor": { 1016 | "version": "1.0.0", 1017 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1018 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1019 | "requires": { 1020 | "kind-of": "^6.0.0" 1021 | } 1022 | }, 1023 | "is-descriptor": { 1024 | "version": "1.0.2", 1025 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1026 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1027 | "requires": { 1028 | "is-accessor-descriptor": "^1.0.0", 1029 | "is-data-descriptor": "^1.0.0", 1030 | "kind-of": "^6.0.2" 1031 | } 1032 | } 1033 | } 1034 | }, 1035 | "delayed-stream": { 1036 | "version": "1.0.0", 1037 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1038 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 1039 | }, 1040 | "depd": { 1041 | "version": "1.1.2", 1042 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1043 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1044 | }, 1045 | "destroy": { 1046 | "version": "1.0.4", 1047 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 1048 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 1049 | }, 1050 | "diff-match-patch": { 1051 | "version": "1.0.4", 1052 | "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", 1053 | "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" 1054 | }, 1055 | "dir-glob": { 1056 | "version": "2.0.0", 1057 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", 1058 | "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", 1059 | "requires": { 1060 | "arrify": "^1.0.1", 1061 | "path-type": "^3.0.0" 1062 | } 1063 | }, 1064 | "dom-storage": { 1065 | "version": "2.1.0", 1066 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 1067 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 1068 | }, 1069 | "dot-prop": { 1070 | "version": "4.2.0", 1071 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 1072 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 1073 | "requires": { 1074 | "is-obj": "^1.0.0" 1075 | } 1076 | }, 1077 | "duplexify": { 1078 | "version": "3.6.0", 1079 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 1080 | "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", 1081 | "requires": { 1082 | "end-of-stream": "^1.0.0", 1083 | "inherits": "^2.0.1", 1084 | "readable-stream": "^2.0.0", 1085 | "stream-shift": "^1.0.0" 1086 | }, 1087 | "dependencies": { 1088 | "isarray": { 1089 | "version": "1.0.0", 1090 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1091 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1092 | }, 1093 | "readable-stream": { 1094 | "version": "2.3.6", 1095 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1096 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1097 | "requires": { 1098 | "core-util-is": "~1.0.0", 1099 | "inherits": "~2.0.3", 1100 | "isarray": "~1.0.0", 1101 | "process-nextick-args": "~2.0.0", 1102 | "safe-buffer": "~5.1.1", 1103 | "string_decoder": "~1.1.1", 1104 | "util-deprecate": "~1.0.1" 1105 | } 1106 | }, 1107 | "string_decoder": { 1108 | "version": "1.1.1", 1109 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1110 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1111 | "requires": { 1112 | "safe-buffer": "~5.1.0" 1113 | } 1114 | } 1115 | } 1116 | }, 1117 | "eastasianwidth": { 1118 | "version": "0.2.0", 1119 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1120 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 1121 | }, 1122 | "ecc-jsbn": { 1123 | "version": "0.1.2", 1124 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 1125 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 1126 | "optional": true, 1127 | "requires": { 1128 | "jsbn": "~0.1.0", 1129 | "safer-buffer": "^2.1.0" 1130 | } 1131 | }, 1132 | "ecdsa-sig-formatter": { 1133 | "version": "1.0.10", 1134 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 1135 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 1136 | "requires": { 1137 | "safe-buffer": "^5.0.1" 1138 | } 1139 | }, 1140 | "ee-first": { 1141 | "version": "1.1.1", 1142 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1143 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 1144 | }, 1145 | "empower": { 1146 | "version": "1.3.1", 1147 | "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.1.tgz", 1148 | "integrity": "sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==", 1149 | "requires": { 1150 | "core-js": "^2.0.0", 1151 | "empower-core": "^1.2.0" 1152 | } 1153 | }, 1154 | "empower-core": { 1155 | "version": "1.2.0", 1156 | "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz", 1157 | "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==", 1158 | "requires": { 1159 | "call-signature": "0.0.2", 1160 | "core-js": "^2.0.0" 1161 | } 1162 | }, 1163 | "encodeurl": { 1164 | "version": "1.0.2", 1165 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1166 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 1167 | }, 1168 | "end-of-stream": { 1169 | "version": "1.4.1", 1170 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 1171 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 1172 | "requires": { 1173 | "once": "^1.4.0" 1174 | } 1175 | }, 1176 | "ent": { 1177 | "version": "2.2.0", 1178 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 1179 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" 1180 | }, 1181 | "es6-promise": { 1182 | "version": "4.2.5", 1183 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", 1184 | "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" 1185 | }, 1186 | "es6-promisify": { 1187 | "version": "5.0.0", 1188 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 1189 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 1190 | "requires": { 1191 | "es6-promise": "^4.0.3" 1192 | } 1193 | }, 1194 | "escape-html": { 1195 | "version": "1.0.3", 1196 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1197 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 1198 | }, 1199 | "espurify": { 1200 | "version": "1.8.1", 1201 | "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz", 1202 | "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==", 1203 | "requires": { 1204 | "core-js": "^2.0.0" 1205 | } 1206 | }, 1207 | "estraverse": { 1208 | "version": "4.2.0", 1209 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 1210 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 1211 | }, 1212 | "etag": { 1213 | "version": "1.8.1", 1214 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1215 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1216 | }, 1217 | "expand-brackets": { 1218 | "version": "2.1.4", 1219 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 1220 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1221 | "requires": { 1222 | "debug": "^2.3.3", 1223 | "define-property": "^0.2.5", 1224 | "extend-shallow": "^2.0.1", 1225 | "posix-character-classes": "^0.1.0", 1226 | "regex-not": "^1.0.0", 1227 | "snapdragon": "^0.8.1", 1228 | "to-regex": "^3.0.1" 1229 | }, 1230 | "dependencies": { 1231 | "define-property": { 1232 | "version": "0.2.5", 1233 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1234 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1235 | "requires": { 1236 | "is-descriptor": "^0.1.0" 1237 | } 1238 | }, 1239 | "extend-shallow": { 1240 | "version": "2.0.1", 1241 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1242 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1243 | "requires": { 1244 | "is-extendable": "^0.1.0" 1245 | } 1246 | } 1247 | } 1248 | }, 1249 | "express": { 1250 | "version": "4.16.3", 1251 | "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz", 1252 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 1253 | "requires": { 1254 | "accepts": "~1.3.5", 1255 | "array-flatten": "1.1.1", 1256 | "body-parser": "1.18.2", 1257 | "content-disposition": "0.5.2", 1258 | "content-type": "~1.0.4", 1259 | "cookie": "0.3.1", 1260 | "cookie-signature": "1.0.6", 1261 | "debug": "2.6.9", 1262 | "depd": "~1.1.2", 1263 | "encodeurl": "~1.0.2", 1264 | "escape-html": "~1.0.3", 1265 | "etag": "~1.8.1", 1266 | "finalhandler": "1.1.1", 1267 | "fresh": "0.5.2", 1268 | "merge-descriptors": "1.0.1", 1269 | "methods": "~1.1.2", 1270 | "on-finished": "~2.3.0", 1271 | "parseurl": "~1.3.2", 1272 | "path-to-regexp": "0.1.7", 1273 | "proxy-addr": "~2.0.3", 1274 | "qs": "6.5.1", 1275 | "range-parser": "~1.2.0", 1276 | "safe-buffer": "5.1.1", 1277 | "send": "0.16.2", 1278 | "serve-static": "1.13.2", 1279 | "setprototypeof": "1.1.0", 1280 | "statuses": "~1.4.0", 1281 | "type-is": "~1.6.16", 1282 | "utils-merge": "1.0.1", 1283 | "vary": "~1.1.2" 1284 | }, 1285 | "dependencies": { 1286 | "qs": { 1287 | "version": "6.5.1", 1288 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 1289 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 1290 | }, 1291 | "safe-buffer": { 1292 | "version": "5.1.1", 1293 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1294 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1295 | } 1296 | } 1297 | }, 1298 | "extend": { 1299 | "version": "3.0.2", 1300 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1301 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1302 | }, 1303 | "extend-shallow": { 1304 | "version": "3.0.2", 1305 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 1306 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1307 | "requires": { 1308 | "assign-symbols": "^1.0.0", 1309 | "is-extendable": "^1.0.1" 1310 | }, 1311 | "dependencies": { 1312 | "is-extendable": { 1313 | "version": "1.0.1", 1314 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1315 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1316 | "requires": { 1317 | "is-plain-object": "^2.0.4" 1318 | } 1319 | } 1320 | } 1321 | }, 1322 | "extglob": { 1323 | "version": "2.0.4", 1324 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1325 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1326 | "requires": { 1327 | "array-unique": "^0.3.2", 1328 | "define-property": "^1.0.0", 1329 | "expand-brackets": "^2.1.4", 1330 | "extend-shallow": "^2.0.1", 1331 | "fragment-cache": "^0.2.1", 1332 | "regex-not": "^1.0.0", 1333 | "snapdragon": "^0.8.1", 1334 | "to-regex": "^3.0.1" 1335 | }, 1336 | "dependencies": { 1337 | "define-property": { 1338 | "version": "1.0.0", 1339 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1340 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1341 | "requires": { 1342 | "is-descriptor": "^1.0.0" 1343 | } 1344 | }, 1345 | "extend-shallow": { 1346 | "version": "2.0.1", 1347 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1348 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1349 | "requires": { 1350 | "is-extendable": "^0.1.0" 1351 | } 1352 | }, 1353 | "is-accessor-descriptor": { 1354 | "version": "1.0.0", 1355 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1356 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1357 | "requires": { 1358 | "kind-of": "^6.0.0" 1359 | } 1360 | }, 1361 | "is-data-descriptor": { 1362 | "version": "1.0.0", 1363 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1364 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1365 | "requires": { 1366 | "kind-of": "^6.0.0" 1367 | } 1368 | }, 1369 | "is-descriptor": { 1370 | "version": "1.0.2", 1371 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1372 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1373 | "requires": { 1374 | "is-accessor-descriptor": "^1.0.0", 1375 | "is-data-descriptor": "^1.0.0", 1376 | "kind-of": "^6.0.2" 1377 | } 1378 | } 1379 | } 1380 | }, 1381 | "extsprintf": { 1382 | "version": "1.3.0", 1383 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1384 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 1385 | }, 1386 | "fast-deep-equal": { 1387 | "version": "1.1.0", 1388 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 1389 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 1390 | }, 1391 | "fast-glob": { 1392 | "version": "2.2.2", 1393 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", 1394 | "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", 1395 | "requires": { 1396 | "@mrmlnc/readdir-enhanced": "^2.2.1", 1397 | "@nodelib/fs.stat": "^1.0.1", 1398 | "glob-parent": "^3.1.0", 1399 | "is-glob": "^4.0.0", 1400 | "merge2": "^1.2.1", 1401 | "micromatch": "^3.1.10" 1402 | } 1403 | }, 1404 | "fast-json-stable-stringify": { 1405 | "version": "2.0.0", 1406 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1407 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 1408 | }, 1409 | "faye-websocket": { 1410 | "version": "0.11.1", 1411 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", 1412 | "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", 1413 | "requires": { 1414 | "websocket-driver": ">=0.5.1" 1415 | } 1416 | }, 1417 | "ffmpeg-static": { 1418 | "version": "2.3.0", 1419 | "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-2.3.0.tgz", 1420 | "integrity": "sha512-Cb6AjBnybjlxrqBEgrnwRMeQFiyQYUd1C8SsRPabJ4Glc7SD//QHYnDuZlNX5E6sdMitnINkADFGREUtY8lhuQ==" 1421 | }, 1422 | "fill-range": { 1423 | "version": "4.0.0", 1424 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 1425 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1426 | "requires": { 1427 | "extend-shallow": "^2.0.1", 1428 | "is-number": "^3.0.0", 1429 | "repeat-string": "^1.6.1", 1430 | "to-regex-range": "^2.1.0" 1431 | }, 1432 | "dependencies": { 1433 | "extend-shallow": { 1434 | "version": "2.0.1", 1435 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1436 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1437 | "requires": { 1438 | "is-extendable": "^0.1.0" 1439 | } 1440 | } 1441 | } 1442 | }, 1443 | "finalhandler": { 1444 | "version": "1.1.1", 1445 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 1446 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 1447 | "requires": { 1448 | "debug": "2.6.9", 1449 | "encodeurl": "~1.0.2", 1450 | "escape-html": "~1.0.3", 1451 | "on-finished": "~2.3.0", 1452 | "parseurl": "~1.3.2", 1453 | "statuses": "~1.4.0", 1454 | "unpipe": "~1.0.0" 1455 | } 1456 | }, 1457 | "firebase-admin": { 1458 | "version": "6.0.0", 1459 | "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-6.0.0.tgz", 1460 | "integrity": "sha512-ai7ensTAZx9iF6z/lMn7JzFJYSl6+uXYm53GGhWlph+npnQli10FF9YB97OjcVUghapDEWzmb6J0VMtB965nsw==", 1461 | "requires": { 1462 | "@firebase/app": "^0.3.1", 1463 | "@firebase/database": "^0.3.1", 1464 | "@google-cloud/firestore": "^0.16.0", 1465 | "@google-cloud/storage": "^1.6.0", 1466 | "@types/google-cloud__storage": "^1.1.7", 1467 | "@types/node": "^8.0.53", 1468 | "jsonwebtoken": "8.1.0", 1469 | "node-forge": "0.7.4" 1470 | }, 1471 | "dependencies": { 1472 | "@google-cloud/common": { 1473 | "version": "0.17.0", 1474 | "resolved": "http://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", 1475 | "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", 1476 | "optional": true, 1477 | "requires": { 1478 | "array-uniq": "^1.0.3", 1479 | "arrify": "^1.0.1", 1480 | "concat-stream": "^1.6.0", 1481 | "create-error-class": "^3.0.2", 1482 | "duplexify": "^3.5.0", 1483 | "ent": "^2.2.0", 1484 | "extend": "^3.0.1", 1485 | "google-auto-auth": "^0.10.0", 1486 | "is": "^3.2.0", 1487 | "log-driver": "1.2.7", 1488 | "methmeth": "^1.1.0", 1489 | "modelo": "^4.2.0", 1490 | "request": "^2.79.0", 1491 | "retry-request": "^3.0.0", 1492 | "split-array-stream": "^1.0.0", 1493 | "stream-events": "^1.0.1", 1494 | "string-format-obj": "^1.1.0", 1495 | "through2": "^2.0.3" 1496 | } 1497 | }, 1498 | "@google-cloud/storage": { 1499 | "version": "1.7.0", 1500 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.7.0.tgz", 1501 | "integrity": "sha512-QaAxzCkbhspwajoaEnT0GcnQcpjPRcBrHYuQsXtD05BtOJgVnHCLXSsfUiRdU0nVpK+Thp7+sTkQ0fvk5PanKg==", 1502 | "optional": true, 1503 | "requires": { 1504 | "@google-cloud/common": "^0.17.0", 1505 | "arrify": "^1.0.0", 1506 | "async": "^2.0.1", 1507 | "compressible": "^2.0.12", 1508 | "concat-stream": "^1.5.0", 1509 | "create-error-class": "^3.0.2", 1510 | "duplexify": "^3.5.0", 1511 | "extend": "^3.0.0", 1512 | "gcs-resumable-upload": "^0.10.2", 1513 | "hash-stream-validation": "^0.2.1", 1514 | "is": "^3.0.1", 1515 | "mime": "^2.2.0", 1516 | "mime-types": "^2.0.8", 1517 | "once": "^1.3.1", 1518 | "pumpify": "^1.5.1", 1519 | "request": "^2.85.0", 1520 | "safe-buffer": "^5.1.1", 1521 | "snakeize": "^0.1.0", 1522 | "stream-events": "^1.0.1", 1523 | "through2": "^2.0.0", 1524 | "xdg-basedir": "^3.0.0" 1525 | } 1526 | }, 1527 | "configstore": { 1528 | "version": "3.1.2", 1529 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 1530 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 1531 | "optional": true, 1532 | "requires": { 1533 | "dot-prop": "^4.1.0", 1534 | "graceful-fs": "^4.1.2", 1535 | "make-dir": "^1.0.0", 1536 | "unique-string": "^1.0.0", 1537 | "write-file-atomic": "^2.0.0", 1538 | "xdg-basedir": "^3.0.0" 1539 | } 1540 | }, 1541 | "gcs-resumable-upload": { 1542 | "version": "0.10.2", 1543 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.10.2.tgz", 1544 | "integrity": "sha1-fymz7iPc7EFwNnwHEUGCScZgVF8=", 1545 | "optional": true, 1546 | "requires": { 1547 | "configstore": "^3.1.2", 1548 | "google-auto-auth": "^0.10.0", 1549 | "pumpify": "^1.4.0", 1550 | "request": "^2.85.0", 1551 | "stream-events": "^1.0.3" 1552 | } 1553 | }, 1554 | "retry-request": { 1555 | "version": "3.3.2", 1556 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz", 1557 | "integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==", 1558 | "optional": true, 1559 | "requires": { 1560 | "request": "^2.81.0", 1561 | "through2": "^2.0.0" 1562 | } 1563 | }, 1564 | "split-array-stream": { 1565 | "version": "1.0.3", 1566 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", 1567 | "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", 1568 | "optional": true, 1569 | "requires": { 1570 | "async": "^2.4.0", 1571 | "is-stream-ended": "^0.1.0" 1572 | } 1573 | } 1574 | } 1575 | }, 1576 | "firebase-functions": { 1577 | "version": "2.0.5", 1578 | "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-2.0.5.tgz", 1579 | "integrity": "sha512-XedOTdaej68I/AmJyeDIKL2Cw6MwI7Ugov5QoEsOU9bh25iAseZmFKFQeqimW5Wb9wKLAli2Wq8ld+FtdOwdvQ==", 1580 | "requires": { 1581 | "@types/cors": "^2.8.1", 1582 | "@types/express": "^4.11.1", 1583 | "@types/jsonwebtoken": "^7.2.6", 1584 | "@types/lodash": "^4.14.34", 1585 | "cors": "^2.8.4", 1586 | "express": "^4.16.2", 1587 | "jsonwebtoken": "^8.2.1", 1588 | "lodash": "^4.6.1" 1589 | }, 1590 | "dependencies": { 1591 | "jsonwebtoken": { 1592 | "version": "8.3.0", 1593 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz", 1594 | "integrity": "sha512-oge/hvlmeJCH+iIz1DwcO7vKPkNGJHhgkspk8OH3VKlw+mbi42WtD4ig1+VXRln765vxptAv+xT26Fd3cteqag==", 1595 | "requires": { 1596 | "jws": "^3.1.5", 1597 | "lodash.includes": "^4.3.0", 1598 | "lodash.isboolean": "^3.0.3", 1599 | "lodash.isinteger": "^4.0.4", 1600 | "lodash.isnumber": "^3.0.3", 1601 | "lodash.isplainobject": "^4.0.6", 1602 | "lodash.isstring": "^4.0.1", 1603 | "lodash.once": "^4.0.0", 1604 | "ms": "^2.1.1" 1605 | } 1606 | }, 1607 | "ms": { 1608 | "version": "2.1.1", 1609 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1610 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1611 | } 1612 | } 1613 | }, 1614 | "fluent-ffmpeg": { 1615 | "version": "2.1.2", 1616 | "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", 1617 | "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=", 1618 | "requires": { 1619 | "async": ">=0.2.9", 1620 | "which": "^1.1.1" 1621 | } 1622 | }, 1623 | "follow-redirects": { 1624 | "version": "1.5.8", 1625 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz", 1626 | "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==", 1627 | "requires": { 1628 | "debug": "=3.1.0" 1629 | }, 1630 | "dependencies": { 1631 | "debug": { 1632 | "version": "3.1.0", 1633 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1634 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1635 | "requires": { 1636 | "ms": "2.0.0" 1637 | } 1638 | } 1639 | } 1640 | }, 1641 | "for-in": { 1642 | "version": "1.0.2", 1643 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1644 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 1645 | }, 1646 | "forever-agent": { 1647 | "version": "0.6.1", 1648 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1649 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1650 | }, 1651 | "form-data": { 1652 | "version": "2.3.2", 1653 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 1654 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 1655 | "requires": { 1656 | "asynckit": "^0.4.0", 1657 | "combined-stream": "1.0.6", 1658 | "mime-types": "^2.1.12" 1659 | }, 1660 | "dependencies": { 1661 | "combined-stream": { 1662 | "version": "1.0.6", 1663 | "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 1664 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 1665 | "requires": { 1666 | "delayed-stream": "~1.0.0" 1667 | } 1668 | } 1669 | } 1670 | }, 1671 | "forwarded": { 1672 | "version": "0.1.2", 1673 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1674 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1675 | }, 1676 | "fragment-cache": { 1677 | "version": "0.2.1", 1678 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1679 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1680 | "requires": { 1681 | "map-cache": "^0.2.2" 1682 | } 1683 | }, 1684 | "fresh": { 1685 | "version": "0.5.2", 1686 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1687 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1688 | }, 1689 | "fs.realpath": { 1690 | "version": "1.0.0", 1691 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1692 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1693 | }, 1694 | "functional-red-black-tree": { 1695 | "version": "1.0.1", 1696 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1697 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1698 | "optional": true 1699 | }, 1700 | "gcp-metadata": { 1701 | "version": "0.6.3", 1702 | "resolved": "http://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", 1703 | "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", 1704 | "requires": { 1705 | "axios": "^0.18.0", 1706 | "extend": "^3.0.1", 1707 | "retry-axios": "0.3.2" 1708 | } 1709 | }, 1710 | "gcs-resumable-upload": { 1711 | "version": "0.13.0", 1712 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.13.0.tgz", 1713 | "integrity": "sha512-hrSYPFJWyx8FDLJEK3XeqbNcCjkRqcuKSaUxL1RpwEAWAxtV+AdUH+NX3n7st/U6/JddQkdb1mmWAy3jgRDflw==", 1714 | "requires": { 1715 | "axios": "^0.18.0", 1716 | "configstore": "^4.0.0", 1717 | "google-auth-library": "^2.0.0", 1718 | "pumpify": "^1.5.1", 1719 | "request": "^2.87.0", 1720 | "stream-events": "^1.0.4" 1721 | }, 1722 | "dependencies": { 1723 | "gcp-metadata": { 1724 | "version": "0.7.0", 1725 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz", 1726 | "integrity": "sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g==", 1727 | "requires": { 1728 | "axios": "^0.18.0", 1729 | "extend": "^3.0.1", 1730 | "retry-axios": "0.3.2" 1731 | } 1732 | }, 1733 | "google-auth-library": { 1734 | "version": "2.0.0", 1735 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.0.tgz", 1736 | "integrity": "sha512-lN6jecH8L30uAirTeOm9ij9CTMJniwg7fbuyOpgH4lFkO50LKhPrx/ZbLGK8aBCzi/u4/tpdZnJABFuMqtIx0A==", 1737 | "requires": { 1738 | "axios": "^0.18.0", 1739 | "gcp-metadata": "^0.7.0", 1740 | "gtoken": "^2.3.0", 1741 | "https-proxy-agent": "^2.2.1", 1742 | "jws": "^3.1.5", 1743 | "lodash.isstring": "^4.0.1", 1744 | "lru-cache": "^4.1.3", 1745 | "semver": "^5.5.0" 1746 | } 1747 | } 1748 | } 1749 | }, 1750 | "get-value": { 1751 | "version": "2.0.6", 1752 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1753 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 1754 | }, 1755 | "getpass": { 1756 | "version": "0.1.7", 1757 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1758 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1759 | "requires": { 1760 | "assert-plus": "^1.0.0" 1761 | } 1762 | }, 1763 | "glob": { 1764 | "version": "7.1.3", 1765 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1766 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1767 | "requires": { 1768 | "fs.realpath": "^1.0.0", 1769 | "inflight": "^1.0.4", 1770 | "inherits": "2", 1771 | "minimatch": "^3.0.4", 1772 | "once": "^1.3.0", 1773 | "path-is-absolute": "^1.0.0" 1774 | } 1775 | }, 1776 | "glob-parent": { 1777 | "version": "3.1.0", 1778 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1779 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1780 | "requires": { 1781 | "is-glob": "^3.1.0", 1782 | "path-dirname": "^1.0.0" 1783 | }, 1784 | "dependencies": { 1785 | "is-glob": { 1786 | "version": "3.1.0", 1787 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1788 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1789 | "requires": { 1790 | "is-extglob": "^2.1.0" 1791 | } 1792 | } 1793 | } 1794 | }, 1795 | "glob-to-regexp": { 1796 | "version": "0.3.0", 1797 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", 1798 | "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" 1799 | }, 1800 | "globby": { 1801 | "version": "8.0.1", 1802 | "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", 1803 | "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", 1804 | "requires": { 1805 | "array-union": "^1.0.1", 1806 | "dir-glob": "^2.0.0", 1807 | "fast-glob": "^2.0.2", 1808 | "glob": "^7.1.2", 1809 | "ignore": "^3.3.5", 1810 | "pify": "^3.0.0", 1811 | "slash": "^1.0.0" 1812 | } 1813 | }, 1814 | "google-auth-library": { 1815 | "version": "1.6.1", 1816 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", 1817 | "integrity": "sha512-jYiWC8NA9n9OtQM7ANn0Tk464do9yhKEtaJ72pKcaBiEwn4LwcGYIYOfwtfsSm3aur/ed3tlSxbmg24IAT6gAg==", 1818 | "requires": { 1819 | "axios": "^0.18.0", 1820 | "gcp-metadata": "^0.6.3", 1821 | "gtoken": "^2.3.0", 1822 | "jws": "^3.1.5", 1823 | "lodash.isstring": "^4.0.1", 1824 | "lru-cache": "^4.1.3", 1825 | "retry-axios": "^0.3.2" 1826 | } 1827 | }, 1828 | "google-auto-auth": { 1829 | "version": "0.10.1", 1830 | "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.1.tgz", 1831 | "integrity": "sha512-iIqSbY7Ypd32mnHGbYctp80vZzXoDlvI9gEfvtl3kmyy5HzOcrZCIGCBdSlIzRsg7nHpQiHE3Zl6Ycur6TSodQ==", 1832 | "requires": { 1833 | "async": "^2.3.0", 1834 | "gcp-metadata": "^0.6.1", 1835 | "google-auth-library": "^1.3.1", 1836 | "request": "^2.79.0" 1837 | } 1838 | }, 1839 | "google-gax": { 1840 | "version": "0.18.0", 1841 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.18.0.tgz", 1842 | "integrity": "sha512-cF2s3aTw1cWDHsjaYfIizJZT0KJF0FSM3laiCX4O/K0ZcdmeE9PitG2bxRH+dY+Sz094//m+JoH1hBtSyOf67A==", 1843 | "optional": true, 1844 | "requires": { 1845 | "@grpc/proto-loader": "^0.3.0", 1846 | "duplexify": "^3.6.0", 1847 | "extend": "^3.0.1", 1848 | "globby": "^8.0.1", 1849 | "google-auth-library": "^1.6.1", 1850 | "google-proto-files": "^0.16.0", 1851 | "grpc": "^1.12.2", 1852 | "is-stream-ended": "^0.1.4", 1853 | "lodash": "^4.17.10", 1854 | "protobufjs": "^6.8.8", 1855 | "retry-request": "^4.0.0", 1856 | "through2": "^2.0.3" 1857 | } 1858 | }, 1859 | "google-p12-pem": { 1860 | "version": "1.0.2", 1861 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", 1862 | "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", 1863 | "requires": { 1864 | "node-forge": "^0.7.4", 1865 | "pify": "^3.0.0" 1866 | } 1867 | }, 1868 | "google-proto-files": { 1869 | "version": "0.16.1", 1870 | "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.16.1.tgz", 1871 | "integrity": "sha512-ykdhaYDiU/jlyrkzZDPemraKwVIgLT31XMHVNSJW//R9VED56hqSDRMx1Jlxbf0O4iDZnBWQ0JQLHbM2r5+wuA==", 1872 | "requires": { 1873 | "globby": "^8.0.0", 1874 | "power-assert": "^1.4.4", 1875 | "protobufjs": "^6.8.0" 1876 | } 1877 | }, 1878 | "graceful-fs": { 1879 | "version": "4.1.11", 1880 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1881 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1882 | }, 1883 | "grpc": { 1884 | "version": "1.15.1", 1885 | "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.15.1.tgz", 1886 | "integrity": "sha512-BfJ6BpFE93xQW69oYfgVQDxSb7LqdQbnddvhFq4tUsj7s0NAIRrrN3fmN2Bi3qpGFRemsKsWPIchw3YNNq2Xjg==", 1887 | "optional": true, 1888 | "requires": { 1889 | "lodash": "^4.17.5", 1890 | "nan": "^2.0.0", 1891 | "node-pre-gyp": "^0.10.0", 1892 | "protobufjs": "^5.0.3" 1893 | }, 1894 | "dependencies": { 1895 | "abbrev": { 1896 | "version": "1.1.1", 1897 | "bundled": true, 1898 | "optional": true 1899 | }, 1900 | "ansi-regex": { 1901 | "version": "2.1.1", 1902 | "bundled": true 1903 | }, 1904 | "aproba": { 1905 | "version": "1.2.0", 1906 | "bundled": true, 1907 | "optional": true 1908 | }, 1909 | "are-we-there-yet": { 1910 | "version": "1.1.5", 1911 | "bundled": true, 1912 | "optional": true, 1913 | "requires": { 1914 | "delegates": "^1.0.0", 1915 | "readable-stream": "^2.0.6" 1916 | } 1917 | }, 1918 | "balanced-match": { 1919 | "version": "1.0.0", 1920 | "bundled": true 1921 | }, 1922 | "brace-expansion": { 1923 | "version": "1.1.11", 1924 | "bundled": true, 1925 | "requires": { 1926 | "balanced-match": "^1.0.0", 1927 | "concat-map": "0.0.1" 1928 | } 1929 | }, 1930 | "chownr": { 1931 | "version": "1.0.1", 1932 | "bundled": true, 1933 | "optional": true 1934 | }, 1935 | "code-point-at": { 1936 | "version": "1.1.0", 1937 | "bundled": true 1938 | }, 1939 | "concat-map": { 1940 | "version": "0.0.1", 1941 | "bundled": true 1942 | }, 1943 | "console-control-strings": { 1944 | "version": "1.1.0", 1945 | "bundled": true 1946 | }, 1947 | "core-util-is": { 1948 | "version": "1.0.2", 1949 | "bundled": true, 1950 | "optional": true 1951 | }, 1952 | "debug": { 1953 | "version": "2.6.9", 1954 | "bundled": true, 1955 | "optional": true, 1956 | "requires": { 1957 | "ms": "2.0.0" 1958 | } 1959 | }, 1960 | "deep-extend": { 1961 | "version": "0.6.0", 1962 | "bundled": true, 1963 | "optional": true 1964 | }, 1965 | "delegates": { 1966 | "version": "1.0.0", 1967 | "bundled": true, 1968 | "optional": true 1969 | }, 1970 | "detect-libc": { 1971 | "version": "1.0.3", 1972 | "bundled": true, 1973 | "optional": true 1974 | }, 1975 | "fs-minipass": { 1976 | "version": "1.2.5", 1977 | "bundled": true, 1978 | "optional": true, 1979 | "requires": { 1980 | "minipass": "^2.2.1" 1981 | } 1982 | }, 1983 | "fs.realpath": { 1984 | "version": "1.0.0", 1985 | "bundled": true 1986 | }, 1987 | "gauge": { 1988 | "version": "2.7.4", 1989 | "bundled": true, 1990 | "optional": true, 1991 | "requires": { 1992 | "aproba": "^1.0.3", 1993 | "console-control-strings": "^1.0.0", 1994 | "has-unicode": "^2.0.0", 1995 | "object-assign": "^4.1.0", 1996 | "signal-exit": "^3.0.0", 1997 | "string-width": "^1.0.1", 1998 | "strip-ansi": "^3.0.1", 1999 | "wide-align": "^1.1.0" 2000 | } 2001 | }, 2002 | "glob": { 2003 | "version": "7.1.2", 2004 | "bundled": true, 2005 | "requires": { 2006 | "fs.realpath": "^1.0.0", 2007 | "inflight": "^1.0.4", 2008 | "inherits": "2", 2009 | "minimatch": "^3.0.4", 2010 | "once": "^1.3.0", 2011 | "path-is-absolute": "^1.0.0" 2012 | } 2013 | }, 2014 | "has-unicode": { 2015 | "version": "2.0.1", 2016 | "bundled": true, 2017 | "optional": true 2018 | }, 2019 | "iconv-lite": { 2020 | "version": "0.4.23", 2021 | "bundled": true, 2022 | "optional": true, 2023 | "requires": { 2024 | "safer-buffer": ">= 2.1.2 < 3" 2025 | } 2026 | }, 2027 | "ignore-walk": { 2028 | "version": "3.0.1", 2029 | "bundled": true, 2030 | "optional": true, 2031 | "requires": { 2032 | "minimatch": "^3.0.4" 2033 | } 2034 | }, 2035 | "inflight": { 2036 | "version": "1.0.6", 2037 | "bundled": true, 2038 | "requires": { 2039 | "once": "^1.3.0", 2040 | "wrappy": "1" 2041 | } 2042 | }, 2043 | "inherits": { 2044 | "version": "2.0.3", 2045 | "bundled": true 2046 | }, 2047 | "ini": { 2048 | "version": "1.3.5", 2049 | "bundled": true, 2050 | "optional": true 2051 | }, 2052 | "is-fullwidth-code-point": { 2053 | "version": "1.0.0", 2054 | "bundled": true, 2055 | "requires": { 2056 | "number-is-nan": "^1.0.0" 2057 | } 2058 | }, 2059 | "isarray": { 2060 | "version": "1.0.0", 2061 | "bundled": true, 2062 | "optional": true 2063 | }, 2064 | "minimatch": { 2065 | "version": "3.0.4", 2066 | "bundled": true, 2067 | "requires": { 2068 | "brace-expansion": "^1.1.7" 2069 | } 2070 | }, 2071 | "minimist": { 2072 | "version": "1.2.0", 2073 | "bundled": true, 2074 | "optional": true 2075 | }, 2076 | "minipass": { 2077 | "version": "2.3.3", 2078 | "bundled": true, 2079 | "requires": { 2080 | "safe-buffer": "^5.1.2", 2081 | "yallist": "^3.0.0" 2082 | } 2083 | }, 2084 | "minizlib": { 2085 | "version": "1.1.0", 2086 | "bundled": true, 2087 | "optional": true, 2088 | "requires": { 2089 | "minipass": "^2.2.1" 2090 | } 2091 | }, 2092 | "mkdirp": { 2093 | "version": "0.5.1", 2094 | "bundled": true, 2095 | "requires": { 2096 | "minimist": "0.0.8" 2097 | }, 2098 | "dependencies": { 2099 | "minimist": { 2100 | "version": "0.0.8", 2101 | "bundled": true 2102 | } 2103 | } 2104 | }, 2105 | "ms": { 2106 | "version": "2.0.0", 2107 | "bundled": true, 2108 | "optional": true 2109 | }, 2110 | "needle": { 2111 | "version": "2.2.2", 2112 | "bundled": true, 2113 | "optional": true, 2114 | "requires": { 2115 | "debug": "^2.1.2", 2116 | "iconv-lite": "^0.4.4", 2117 | "sax": "^1.2.4" 2118 | } 2119 | }, 2120 | "node-pre-gyp": { 2121 | "version": "0.10.3", 2122 | "bundled": true, 2123 | "optional": true, 2124 | "requires": { 2125 | "detect-libc": "^1.0.2", 2126 | "mkdirp": "^0.5.1", 2127 | "needle": "^2.2.1", 2128 | "nopt": "^4.0.1", 2129 | "npm-packlist": "^1.1.6", 2130 | "npmlog": "^4.0.2", 2131 | "rc": "^1.2.7", 2132 | "rimraf": "^2.6.1", 2133 | "semver": "^5.3.0", 2134 | "tar": "^4" 2135 | } 2136 | }, 2137 | "nopt": { 2138 | "version": "4.0.1", 2139 | "bundled": true, 2140 | "optional": true, 2141 | "requires": { 2142 | "abbrev": "1", 2143 | "osenv": "^0.1.4" 2144 | } 2145 | }, 2146 | "npm-bundled": { 2147 | "version": "1.0.3", 2148 | "bundled": true, 2149 | "optional": true 2150 | }, 2151 | "npm-packlist": { 2152 | "version": "1.1.11", 2153 | "bundled": true, 2154 | "optional": true, 2155 | "requires": { 2156 | "ignore-walk": "^3.0.1", 2157 | "npm-bundled": "^1.0.1" 2158 | } 2159 | }, 2160 | "npmlog": { 2161 | "version": "4.1.2", 2162 | "bundled": true, 2163 | "optional": true, 2164 | "requires": { 2165 | "are-we-there-yet": "~1.1.2", 2166 | "console-control-strings": "~1.1.0", 2167 | "gauge": "~2.7.3", 2168 | "set-blocking": "~2.0.0" 2169 | } 2170 | }, 2171 | "number-is-nan": { 2172 | "version": "1.0.1", 2173 | "bundled": true 2174 | }, 2175 | "object-assign": { 2176 | "version": "4.1.1", 2177 | "bundled": true, 2178 | "optional": true 2179 | }, 2180 | "once": { 2181 | "version": "1.4.0", 2182 | "bundled": true, 2183 | "requires": { 2184 | "wrappy": "1" 2185 | } 2186 | }, 2187 | "os-homedir": { 2188 | "version": "1.0.2", 2189 | "bundled": true, 2190 | "optional": true 2191 | }, 2192 | "os-tmpdir": { 2193 | "version": "1.0.2", 2194 | "bundled": true, 2195 | "optional": true 2196 | }, 2197 | "osenv": { 2198 | "version": "0.1.5", 2199 | "bundled": true, 2200 | "optional": true, 2201 | "requires": { 2202 | "os-homedir": "^1.0.0", 2203 | "os-tmpdir": "^1.0.0" 2204 | } 2205 | }, 2206 | "path-is-absolute": { 2207 | "version": "1.0.1", 2208 | "bundled": true 2209 | }, 2210 | "process-nextick-args": { 2211 | "version": "2.0.0", 2212 | "bundled": true, 2213 | "optional": true 2214 | }, 2215 | "protobufjs": { 2216 | "version": "5.0.3", 2217 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", 2218 | "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", 2219 | "optional": true, 2220 | "requires": { 2221 | "ascli": "~1", 2222 | "bytebuffer": "~5", 2223 | "glob": "^7.0.5", 2224 | "yargs": "^3.10.0" 2225 | } 2226 | }, 2227 | "rc": { 2228 | "version": "1.2.8", 2229 | "bundled": true, 2230 | "optional": true, 2231 | "requires": { 2232 | "deep-extend": "^0.6.0", 2233 | "ini": "~1.3.0", 2234 | "minimist": "^1.2.0", 2235 | "strip-json-comments": "~2.0.1" 2236 | } 2237 | }, 2238 | "readable-stream": { 2239 | "version": "2.3.6", 2240 | "bundled": true, 2241 | "optional": true, 2242 | "requires": { 2243 | "core-util-is": "~1.0.0", 2244 | "inherits": "~2.0.3", 2245 | "isarray": "~1.0.0", 2246 | "process-nextick-args": "~2.0.0", 2247 | "safe-buffer": "~5.1.1", 2248 | "string_decoder": "~1.1.1", 2249 | "util-deprecate": "~1.0.1" 2250 | } 2251 | }, 2252 | "rimraf": { 2253 | "version": "2.6.2", 2254 | "bundled": true, 2255 | "optional": true, 2256 | "requires": { 2257 | "glob": "^7.0.5" 2258 | } 2259 | }, 2260 | "safe-buffer": { 2261 | "version": "5.1.2", 2262 | "bundled": true 2263 | }, 2264 | "safer-buffer": { 2265 | "version": "2.1.2", 2266 | "bundled": true, 2267 | "optional": true 2268 | }, 2269 | "sax": { 2270 | "version": "1.2.4", 2271 | "bundled": true, 2272 | "optional": true 2273 | }, 2274 | "semver": { 2275 | "version": "5.5.0", 2276 | "bundled": true, 2277 | "optional": true 2278 | }, 2279 | "set-blocking": { 2280 | "version": "2.0.0", 2281 | "bundled": true, 2282 | "optional": true 2283 | }, 2284 | "signal-exit": { 2285 | "version": "3.0.2", 2286 | "bundled": true, 2287 | "optional": true 2288 | }, 2289 | "string-width": { 2290 | "version": "1.0.2", 2291 | "bundled": true, 2292 | "requires": { 2293 | "code-point-at": "^1.0.0", 2294 | "is-fullwidth-code-point": "^1.0.0", 2295 | "strip-ansi": "^3.0.0" 2296 | } 2297 | }, 2298 | "string_decoder": { 2299 | "version": "1.1.1", 2300 | "bundled": true, 2301 | "optional": true, 2302 | "requires": { 2303 | "safe-buffer": "~5.1.0" 2304 | } 2305 | }, 2306 | "strip-ansi": { 2307 | "version": "3.0.1", 2308 | "bundled": true, 2309 | "requires": { 2310 | "ansi-regex": "^2.0.0" 2311 | } 2312 | }, 2313 | "strip-json-comments": { 2314 | "version": "2.0.1", 2315 | "bundled": true, 2316 | "optional": true 2317 | }, 2318 | "tar": { 2319 | "version": "4.4.6", 2320 | "bundled": true, 2321 | "optional": true, 2322 | "requires": { 2323 | "chownr": "^1.0.1", 2324 | "fs-minipass": "^1.2.5", 2325 | "minipass": "^2.3.3", 2326 | "minizlib": "^1.1.0", 2327 | "mkdirp": "^0.5.0", 2328 | "safe-buffer": "^5.1.2", 2329 | "yallist": "^3.0.2" 2330 | } 2331 | }, 2332 | "util-deprecate": { 2333 | "version": "1.0.2", 2334 | "bundled": true, 2335 | "optional": true 2336 | }, 2337 | "wide-align": { 2338 | "version": "1.1.3", 2339 | "bundled": true, 2340 | "optional": true, 2341 | "requires": { 2342 | "string-width": "^1.0.2 || 2" 2343 | } 2344 | }, 2345 | "wrappy": { 2346 | "version": "1.0.2", 2347 | "bundled": true 2348 | }, 2349 | "yallist": { 2350 | "version": "3.0.2", 2351 | "bundled": true 2352 | } 2353 | } 2354 | }, 2355 | "gtoken": { 2356 | "version": "2.3.0", 2357 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz", 2358 | "integrity": "sha512-Jc9/8mV630cZE9FC5tIlJCZNdUjwunvlwOtCz6IDlaiB4Sz68ki29a1+q97sWTnTYroiuF9B135rod9zrQdHLw==", 2359 | "requires": { 2360 | "axios": "^0.18.0", 2361 | "google-p12-pem": "^1.0.0", 2362 | "jws": "^3.1.4", 2363 | "mime": "^2.2.0", 2364 | "pify": "^3.0.0" 2365 | } 2366 | }, 2367 | "har-schema": { 2368 | "version": "2.0.0", 2369 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 2370 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 2371 | }, 2372 | "har-validator": { 2373 | "version": "5.1.0", 2374 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 2375 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 2376 | "requires": { 2377 | "ajv": "^5.3.0", 2378 | "har-schema": "^2.0.0" 2379 | } 2380 | }, 2381 | "has-value": { 2382 | "version": "1.0.0", 2383 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 2384 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 2385 | "requires": { 2386 | "get-value": "^2.0.6", 2387 | "has-values": "^1.0.0", 2388 | "isobject": "^3.0.0" 2389 | } 2390 | }, 2391 | "has-values": { 2392 | "version": "1.0.0", 2393 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 2394 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 2395 | "requires": { 2396 | "is-number": "^3.0.0", 2397 | "kind-of": "^4.0.0" 2398 | }, 2399 | "dependencies": { 2400 | "kind-of": { 2401 | "version": "4.0.0", 2402 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 2403 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 2404 | "requires": { 2405 | "is-buffer": "^1.1.5" 2406 | } 2407 | } 2408 | } 2409 | }, 2410 | "hash-stream-validation": { 2411 | "version": "0.2.1", 2412 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", 2413 | "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", 2414 | "requires": { 2415 | "through2": "^2.0.0" 2416 | } 2417 | }, 2418 | "http-errors": { 2419 | "version": "1.6.3", 2420 | "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 2421 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 2422 | "requires": { 2423 | "depd": "~1.1.2", 2424 | "inherits": "2.0.3", 2425 | "setprototypeof": "1.1.0", 2426 | "statuses": ">= 1.4.0 < 2" 2427 | } 2428 | }, 2429 | "http-parser-js": { 2430 | "version": "0.4.13", 2431 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", 2432 | "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" 2433 | }, 2434 | "http-signature": { 2435 | "version": "1.2.0", 2436 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 2437 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 2438 | "requires": { 2439 | "assert-plus": "^1.0.0", 2440 | "jsprim": "^1.2.2", 2441 | "sshpk": "^1.7.0" 2442 | } 2443 | }, 2444 | "https-proxy-agent": { 2445 | "version": "2.2.1", 2446 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 2447 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 2448 | "requires": { 2449 | "agent-base": "^4.1.0", 2450 | "debug": "^3.1.0" 2451 | }, 2452 | "dependencies": { 2453 | "debug": { 2454 | "version": "3.2.5", 2455 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", 2456 | "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", 2457 | "requires": { 2458 | "ms": "^2.1.1" 2459 | } 2460 | }, 2461 | "ms": { 2462 | "version": "2.1.1", 2463 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2464 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 2465 | } 2466 | } 2467 | }, 2468 | "iconv-lite": { 2469 | "version": "0.4.19", 2470 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 2471 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 2472 | }, 2473 | "ignore": { 2474 | "version": "3.3.10", 2475 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 2476 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" 2477 | }, 2478 | "imurmurhash": { 2479 | "version": "0.1.4", 2480 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2481 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 2482 | }, 2483 | "indexof": { 2484 | "version": "0.0.1", 2485 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 2486 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 2487 | }, 2488 | "inflight": { 2489 | "version": "1.0.6", 2490 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2491 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2492 | "requires": { 2493 | "once": "^1.3.0", 2494 | "wrappy": "1" 2495 | } 2496 | }, 2497 | "inherits": { 2498 | "version": "2.0.3", 2499 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2500 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2501 | }, 2502 | "invert-kv": { 2503 | "version": "1.0.0", 2504 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 2505 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 2506 | "optional": true 2507 | }, 2508 | "ipaddr.js": { 2509 | "version": "1.8.0", 2510 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 2511 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 2512 | }, 2513 | "is": { 2514 | "version": "3.2.1", 2515 | "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", 2516 | "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" 2517 | }, 2518 | "is-accessor-descriptor": { 2519 | "version": "0.1.6", 2520 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 2521 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 2522 | "requires": { 2523 | "kind-of": "^3.0.2" 2524 | }, 2525 | "dependencies": { 2526 | "kind-of": { 2527 | "version": "3.2.2", 2528 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2529 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2530 | "requires": { 2531 | "is-buffer": "^1.1.5" 2532 | } 2533 | } 2534 | } 2535 | }, 2536 | "is-buffer": { 2537 | "version": "1.1.6", 2538 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 2539 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 2540 | }, 2541 | "is-data-descriptor": { 2542 | "version": "0.1.4", 2543 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 2544 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 2545 | "requires": { 2546 | "kind-of": "^3.0.2" 2547 | }, 2548 | "dependencies": { 2549 | "kind-of": { 2550 | "version": "3.2.2", 2551 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2552 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2553 | "requires": { 2554 | "is-buffer": "^1.1.5" 2555 | } 2556 | } 2557 | } 2558 | }, 2559 | "is-descriptor": { 2560 | "version": "0.1.6", 2561 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 2562 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 2563 | "requires": { 2564 | "is-accessor-descriptor": "^0.1.6", 2565 | "is-data-descriptor": "^0.1.4", 2566 | "kind-of": "^5.0.0" 2567 | }, 2568 | "dependencies": { 2569 | "kind-of": { 2570 | "version": "5.1.0", 2571 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 2572 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 2573 | } 2574 | } 2575 | }, 2576 | "is-extendable": { 2577 | "version": "0.1.1", 2578 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 2579 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 2580 | }, 2581 | "is-extglob": { 2582 | "version": "2.1.1", 2583 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2584 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 2585 | }, 2586 | "is-fullwidth-code-point": { 2587 | "version": "1.0.0", 2588 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2589 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2590 | "requires": { 2591 | "number-is-nan": "^1.0.0" 2592 | } 2593 | }, 2594 | "is-glob": { 2595 | "version": "4.0.0", 2596 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", 2597 | "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", 2598 | "requires": { 2599 | "is-extglob": "^2.1.1" 2600 | } 2601 | }, 2602 | "is-number": { 2603 | "version": "3.0.0", 2604 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 2605 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 2606 | "requires": { 2607 | "kind-of": "^3.0.2" 2608 | }, 2609 | "dependencies": { 2610 | "kind-of": { 2611 | "version": "3.2.2", 2612 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2613 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2614 | "requires": { 2615 | "is-buffer": "^1.1.5" 2616 | } 2617 | } 2618 | } 2619 | }, 2620 | "is-obj": { 2621 | "version": "1.0.1", 2622 | "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 2623 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" 2624 | }, 2625 | "is-plain-object": { 2626 | "version": "2.0.4", 2627 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 2628 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 2629 | "requires": { 2630 | "isobject": "^3.0.1" 2631 | } 2632 | }, 2633 | "is-stream-ended": { 2634 | "version": "0.1.4", 2635 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 2636 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 2637 | }, 2638 | "is-typedarray": { 2639 | "version": "1.0.0", 2640 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2641 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 2642 | }, 2643 | "is-windows": { 2644 | "version": "1.0.2", 2645 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 2646 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 2647 | }, 2648 | "isarray": { 2649 | "version": "0.0.1", 2650 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2651 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 2652 | "optional": true 2653 | }, 2654 | "isexe": { 2655 | "version": "2.0.0", 2656 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2657 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 2658 | }, 2659 | "isobject": { 2660 | "version": "3.0.1", 2661 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 2662 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 2663 | }, 2664 | "isstream": { 2665 | "version": "0.1.2", 2666 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 2667 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 2668 | }, 2669 | "jsbn": { 2670 | "version": "0.1.1", 2671 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 2672 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 2673 | "optional": true 2674 | }, 2675 | "json-schema": { 2676 | "version": "0.2.3", 2677 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 2678 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 2679 | }, 2680 | "json-schema-traverse": { 2681 | "version": "0.3.1", 2682 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 2683 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 2684 | }, 2685 | "json-stringify-safe": { 2686 | "version": "5.0.1", 2687 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2688 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 2689 | }, 2690 | "jsonwebtoken": { 2691 | "version": "8.1.0", 2692 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", 2693 | "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", 2694 | "requires": { 2695 | "jws": "^3.1.4", 2696 | "lodash.includes": "^4.3.0", 2697 | "lodash.isboolean": "^3.0.3", 2698 | "lodash.isinteger": "^4.0.4", 2699 | "lodash.isnumber": "^3.0.3", 2700 | "lodash.isplainobject": "^4.0.6", 2701 | "lodash.isstring": "^4.0.1", 2702 | "lodash.once": "^4.0.0", 2703 | "ms": "^2.0.0", 2704 | "xtend": "^4.0.1" 2705 | } 2706 | }, 2707 | "jsprim": { 2708 | "version": "1.4.1", 2709 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 2710 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 2711 | "requires": { 2712 | "assert-plus": "1.0.0", 2713 | "extsprintf": "1.3.0", 2714 | "json-schema": "0.2.3", 2715 | "verror": "1.10.0" 2716 | } 2717 | }, 2718 | "jwa": { 2719 | "version": "1.1.6", 2720 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", 2721 | "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", 2722 | "requires": { 2723 | "buffer-equal-constant-time": "1.0.1", 2724 | "ecdsa-sig-formatter": "1.0.10", 2725 | "safe-buffer": "^5.0.1" 2726 | } 2727 | }, 2728 | "jws": { 2729 | "version": "3.1.5", 2730 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", 2731 | "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", 2732 | "requires": { 2733 | "jwa": "^1.1.5", 2734 | "safe-buffer": "^5.0.1" 2735 | } 2736 | }, 2737 | "kind-of": { 2738 | "version": "6.0.2", 2739 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2740 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 2741 | }, 2742 | "lcid": { 2743 | "version": "1.0.0", 2744 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2745 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2746 | "optional": true, 2747 | "requires": { 2748 | "invert-kv": "^1.0.0" 2749 | } 2750 | }, 2751 | "lodash": { 2752 | "version": "4.17.11", 2753 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 2754 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 2755 | }, 2756 | "lodash.includes": { 2757 | "version": "4.3.0", 2758 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2759 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 2760 | }, 2761 | "lodash.isboolean": { 2762 | "version": "3.0.3", 2763 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2764 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 2765 | }, 2766 | "lodash.isinteger": { 2767 | "version": "4.0.4", 2768 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2769 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 2770 | }, 2771 | "lodash.isnumber": { 2772 | "version": "3.0.3", 2773 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2774 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 2775 | }, 2776 | "lodash.isplainobject": { 2777 | "version": "4.0.6", 2778 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2779 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 2780 | }, 2781 | "lodash.isstring": { 2782 | "version": "4.0.1", 2783 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2784 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 2785 | }, 2786 | "lodash.merge": { 2787 | "version": "4.6.1", 2788 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", 2789 | "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", 2790 | "optional": true 2791 | }, 2792 | "lodash.once": { 2793 | "version": "4.1.1", 2794 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2795 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 2796 | }, 2797 | "log-driver": { 2798 | "version": "1.2.7", 2799 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 2800 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 2801 | "optional": true 2802 | }, 2803 | "long": { 2804 | "version": "4.0.0", 2805 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 2806 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 2807 | }, 2808 | "lru-cache": { 2809 | "version": "4.1.3", 2810 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 2811 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 2812 | "requires": { 2813 | "pseudomap": "^1.0.2", 2814 | "yallist": "^2.1.2" 2815 | } 2816 | }, 2817 | "make-dir": { 2818 | "version": "1.3.0", 2819 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 2820 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 2821 | "requires": { 2822 | "pify": "^3.0.0" 2823 | } 2824 | }, 2825 | "map-cache": { 2826 | "version": "0.2.2", 2827 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 2828 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 2829 | }, 2830 | "map-visit": { 2831 | "version": "1.0.0", 2832 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 2833 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 2834 | "requires": { 2835 | "object-visit": "^1.0.0" 2836 | } 2837 | }, 2838 | "media-typer": { 2839 | "version": "0.3.0", 2840 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2841 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2842 | }, 2843 | "merge-descriptors": { 2844 | "version": "1.0.1", 2845 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2846 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2847 | }, 2848 | "merge2": { 2849 | "version": "1.2.2", 2850 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", 2851 | "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==" 2852 | }, 2853 | "methmeth": { 2854 | "version": "1.1.0", 2855 | "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", 2856 | "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=", 2857 | "optional": true 2858 | }, 2859 | "methods": { 2860 | "version": "1.1.2", 2861 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2862 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2863 | }, 2864 | "micromatch": { 2865 | "version": "3.1.10", 2866 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 2867 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 2868 | "requires": { 2869 | "arr-diff": "^4.0.0", 2870 | "array-unique": "^0.3.2", 2871 | "braces": "^2.3.1", 2872 | "define-property": "^2.0.2", 2873 | "extend-shallow": "^3.0.2", 2874 | "extglob": "^2.0.4", 2875 | "fragment-cache": "^0.2.1", 2876 | "kind-of": "^6.0.2", 2877 | "nanomatch": "^1.2.9", 2878 | "object.pick": "^1.3.0", 2879 | "regex-not": "^1.0.0", 2880 | "snapdragon": "^0.8.1", 2881 | "to-regex": "^3.0.2" 2882 | } 2883 | }, 2884 | "mime": { 2885 | "version": "2.3.1", 2886 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", 2887 | "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" 2888 | }, 2889 | "mime-db": { 2890 | "version": "1.36.0", 2891 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", 2892 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" 2893 | }, 2894 | "mime-types": { 2895 | "version": "2.1.20", 2896 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", 2897 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", 2898 | "requires": { 2899 | "mime-db": "~1.36.0" 2900 | } 2901 | }, 2902 | "minimatch": { 2903 | "version": "3.0.4", 2904 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2905 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2906 | "requires": { 2907 | "brace-expansion": "^1.1.7" 2908 | } 2909 | }, 2910 | "mixin-deep": { 2911 | "version": "1.3.1", 2912 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", 2913 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", 2914 | "requires": { 2915 | "for-in": "^1.0.2", 2916 | "is-extendable": "^1.0.1" 2917 | }, 2918 | "dependencies": { 2919 | "is-extendable": { 2920 | "version": "1.0.1", 2921 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2922 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2923 | "requires": { 2924 | "is-plain-object": "^2.0.4" 2925 | } 2926 | } 2927 | } 2928 | }, 2929 | "modelo": { 2930 | "version": "4.2.3", 2931 | "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", 2932 | "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==", 2933 | "optional": true 2934 | }, 2935 | "ms": { 2936 | "version": "2.0.0", 2937 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2938 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2939 | }, 2940 | "nan": { 2941 | "version": "2.11.0", 2942 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", 2943 | "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", 2944 | "optional": true 2945 | }, 2946 | "nanomatch": { 2947 | "version": "1.2.13", 2948 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 2949 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 2950 | "requires": { 2951 | "arr-diff": "^4.0.0", 2952 | "array-unique": "^0.3.2", 2953 | "define-property": "^2.0.2", 2954 | "extend-shallow": "^3.0.2", 2955 | "fragment-cache": "^0.2.1", 2956 | "is-windows": "^1.0.2", 2957 | "kind-of": "^6.0.2", 2958 | "object.pick": "^1.3.0", 2959 | "regex-not": "^1.0.0", 2960 | "snapdragon": "^0.8.1", 2961 | "to-regex": "^3.0.1" 2962 | } 2963 | }, 2964 | "negotiator": { 2965 | "version": "0.6.1", 2966 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2967 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 2968 | }, 2969 | "node-forge": { 2970 | "version": "0.7.4", 2971 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", 2972 | "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" 2973 | }, 2974 | "number-is-nan": { 2975 | "version": "1.0.1", 2976 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2977 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2978 | }, 2979 | "oauth-sign": { 2980 | "version": "0.9.0", 2981 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2982 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 2983 | }, 2984 | "object-assign": { 2985 | "version": "4.1.1", 2986 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2987 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2988 | }, 2989 | "object-copy": { 2990 | "version": "0.1.0", 2991 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2992 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2993 | "requires": { 2994 | "copy-descriptor": "^0.1.0", 2995 | "define-property": "^0.2.5", 2996 | "kind-of": "^3.0.3" 2997 | }, 2998 | "dependencies": { 2999 | "define-property": { 3000 | "version": "0.2.5", 3001 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 3002 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3003 | "requires": { 3004 | "is-descriptor": "^0.1.0" 3005 | } 3006 | }, 3007 | "kind-of": { 3008 | "version": "3.2.2", 3009 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3010 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3011 | "requires": { 3012 | "is-buffer": "^1.1.5" 3013 | } 3014 | } 3015 | } 3016 | }, 3017 | "object-keys": { 3018 | "version": "1.0.12", 3019 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", 3020 | "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" 3021 | }, 3022 | "object-visit": { 3023 | "version": "1.0.1", 3024 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 3025 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 3026 | "requires": { 3027 | "isobject": "^3.0.0" 3028 | } 3029 | }, 3030 | "object.pick": { 3031 | "version": "1.3.0", 3032 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 3033 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 3034 | "requires": { 3035 | "isobject": "^3.0.1" 3036 | } 3037 | }, 3038 | "on-finished": { 3039 | "version": "2.3.0", 3040 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 3041 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 3042 | "requires": { 3043 | "ee-first": "1.1.1" 3044 | } 3045 | }, 3046 | "once": { 3047 | "version": "1.4.0", 3048 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3049 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3050 | "requires": { 3051 | "wrappy": "1" 3052 | } 3053 | }, 3054 | "optjs": { 3055 | "version": "3.2.2", 3056 | "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", 3057 | "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=", 3058 | "optional": true 3059 | }, 3060 | "os-locale": { 3061 | "version": "1.4.0", 3062 | "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 3063 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 3064 | "optional": true, 3065 | "requires": { 3066 | "lcid": "^1.0.0" 3067 | } 3068 | }, 3069 | "parseurl": { 3070 | "version": "1.3.2", 3071 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 3072 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 3073 | }, 3074 | "pascalcase": { 3075 | "version": "0.1.1", 3076 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 3077 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 3078 | }, 3079 | "path-dirname": { 3080 | "version": "1.0.2", 3081 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 3082 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 3083 | }, 3084 | "path-is-absolute": { 3085 | "version": "1.0.1", 3086 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3087 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 3088 | }, 3089 | "path-to-regexp": { 3090 | "version": "0.1.7", 3091 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 3092 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 3093 | }, 3094 | "path-type": { 3095 | "version": "3.0.0", 3096 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 3097 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 3098 | "requires": { 3099 | "pify": "^3.0.0" 3100 | } 3101 | }, 3102 | "performance-now": { 3103 | "version": "2.1.0", 3104 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 3105 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 3106 | }, 3107 | "pify": { 3108 | "version": "3.0.0", 3109 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 3110 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 3111 | }, 3112 | "posix-character-classes": { 3113 | "version": "0.1.1", 3114 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 3115 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 3116 | }, 3117 | "power-assert": { 3118 | "version": "1.6.1", 3119 | "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz", 3120 | "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==", 3121 | "requires": { 3122 | "define-properties": "^1.1.2", 3123 | "empower": "^1.3.1", 3124 | "power-assert-formatter": "^1.4.1", 3125 | "universal-deep-strict-equal": "^1.2.1", 3126 | "xtend": "^4.0.0" 3127 | } 3128 | }, 3129 | "power-assert-context-formatter": { 3130 | "version": "1.2.0", 3131 | "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz", 3132 | "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==", 3133 | "requires": { 3134 | "core-js": "^2.0.0", 3135 | "power-assert-context-traversal": "^1.2.0" 3136 | } 3137 | }, 3138 | "power-assert-context-reducer-ast": { 3139 | "version": "1.2.0", 3140 | "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz", 3141 | "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==", 3142 | "requires": { 3143 | "acorn": "^5.0.0", 3144 | "acorn-es7-plugin": "^1.0.12", 3145 | "core-js": "^2.0.0", 3146 | "espurify": "^1.6.0", 3147 | "estraverse": "^4.2.0" 3148 | } 3149 | }, 3150 | "power-assert-context-traversal": { 3151 | "version": "1.2.0", 3152 | "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz", 3153 | "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==", 3154 | "requires": { 3155 | "core-js": "^2.0.0", 3156 | "estraverse": "^4.1.0" 3157 | } 3158 | }, 3159 | "power-assert-formatter": { 3160 | "version": "1.4.1", 3161 | "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", 3162 | "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", 3163 | "requires": { 3164 | "core-js": "^2.0.0", 3165 | "power-assert-context-formatter": "^1.0.7", 3166 | "power-assert-context-reducer-ast": "^1.0.7", 3167 | "power-assert-renderer-assertion": "^1.0.7", 3168 | "power-assert-renderer-comparison": "^1.0.7", 3169 | "power-assert-renderer-diagram": "^1.0.7", 3170 | "power-assert-renderer-file": "^1.0.7" 3171 | } 3172 | }, 3173 | "power-assert-renderer-assertion": { 3174 | "version": "1.2.0", 3175 | "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz", 3176 | "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==", 3177 | "requires": { 3178 | "power-assert-renderer-base": "^1.1.1", 3179 | "power-assert-util-string-width": "^1.2.0" 3180 | } 3181 | }, 3182 | "power-assert-renderer-base": { 3183 | "version": "1.1.1", 3184 | "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", 3185 | "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=" 3186 | }, 3187 | "power-assert-renderer-comparison": { 3188 | "version": "1.2.0", 3189 | "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz", 3190 | "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==", 3191 | "requires": { 3192 | "core-js": "^2.0.0", 3193 | "diff-match-patch": "^1.0.0", 3194 | "power-assert-renderer-base": "^1.1.1", 3195 | "stringifier": "^1.3.0", 3196 | "type-name": "^2.0.1" 3197 | } 3198 | }, 3199 | "power-assert-renderer-diagram": { 3200 | "version": "1.2.0", 3201 | "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz", 3202 | "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==", 3203 | "requires": { 3204 | "core-js": "^2.0.0", 3205 | "power-assert-renderer-base": "^1.1.1", 3206 | "power-assert-util-string-width": "^1.2.0", 3207 | "stringifier": "^1.3.0" 3208 | } 3209 | }, 3210 | "power-assert-renderer-file": { 3211 | "version": "1.2.0", 3212 | "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz", 3213 | "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==", 3214 | "requires": { 3215 | "power-assert-renderer-base": "^1.1.1" 3216 | } 3217 | }, 3218 | "power-assert-util-string-width": { 3219 | "version": "1.2.0", 3220 | "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz", 3221 | "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==", 3222 | "requires": { 3223 | "eastasianwidth": "^0.2.0" 3224 | } 3225 | }, 3226 | "process-nextick-args": { 3227 | "version": "2.0.0", 3228 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 3229 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 3230 | }, 3231 | "protobufjs": { 3232 | "version": "6.8.8", 3233 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 3234 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 3235 | "requires": { 3236 | "@protobufjs/aspromise": "^1.1.2", 3237 | "@protobufjs/base64": "^1.1.2", 3238 | "@protobufjs/codegen": "^2.0.4", 3239 | "@protobufjs/eventemitter": "^1.1.0", 3240 | "@protobufjs/fetch": "^1.1.0", 3241 | "@protobufjs/float": "^1.0.2", 3242 | "@protobufjs/inquire": "^1.1.0", 3243 | "@protobufjs/path": "^1.1.2", 3244 | "@protobufjs/pool": "^1.1.0", 3245 | "@protobufjs/utf8": "^1.1.0", 3246 | "@types/long": "^4.0.0", 3247 | "@types/node": "^10.1.0", 3248 | "long": "^4.0.0" 3249 | }, 3250 | "dependencies": { 3251 | "@types/node": { 3252 | "version": "10.11.0", 3253 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.0.tgz", 3254 | "integrity": "sha512-R4Dvw6KjSYn/SpvjRchBOwXr14vVVcFXCtnM3f0aLvlJS8a599rrcEoihcP2/+Z/f75E5GNPd4aWM7j1yei9og==" 3255 | } 3256 | } 3257 | }, 3258 | "proxy-addr": { 3259 | "version": "2.0.4", 3260 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 3261 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 3262 | "requires": { 3263 | "forwarded": "~0.1.2", 3264 | "ipaddr.js": "1.8.0" 3265 | } 3266 | }, 3267 | "pseudomap": { 3268 | "version": "1.0.2", 3269 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 3270 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 3271 | }, 3272 | "psl": { 3273 | "version": "1.1.29", 3274 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 3275 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 3276 | }, 3277 | "pump": { 3278 | "version": "2.0.1", 3279 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 3280 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 3281 | "requires": { 3282 | "end-of-stream": "^1.1.0", 3283 | "once": "^1.3.1" 3284 | } 3285 | }, 3286 | "pumpify": { 3287 | "version": "1.5.1", 3288 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 3289 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 3290 | "requires": { 3291 | "duplexify": "^3.6.0", 3292 | "inherits": "^2.0.3", 3293 | "pump": "^2.0.0" 3294 | } 3295 | }, 3296 | "punycode": { 3297 | "version": "1.4.1", 3298 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3299 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 3300 | }, 3301 | "qs": { 3302 | "version": "6.5.2", 3303 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 3304 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 3305 | }, 3306 | "range-parser": { 3307 | "version": "1.2.0", 3308 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 3309 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 3310 | }, 3311 | "raw-body": { 3312 | "version": "2.3.2", 3313 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 3314 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 3315 | "requires": { 3316 | "bytes": "3.0.0", 3317 | "http-errors": "1.6.2", 3318 | "iconv-lite": "0.4.19", 3319 | "unpipe": "1.0.0" 3320 | }, 3321 | "dependencies": { 3322 | "depd": { 3323 | "version": "1.1.1", 3324 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 3325 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 3326 | }, 3327 | "http-errors": { 3328 | "version": "1.6.2", 3329 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 3330 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 3331 | "requires": { 3332 | "depd": "1.1.1", 3333 | "inherits": "2.0.3", 3334 | "setprototypeof": "1.0.3", 3335 | "statuses": ">= 1.3.1 < 2" 3336 | } 3337 | }, 3338 | "setprototypeof": { 3339 | "version": "1.0.3", 3340 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 3341 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 3342 | } 3343 | } 3344 | }, 3345 | "readable-stream": { 3346 | "version": "1.0.34", 3347 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 3348 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 3349 | "optional": true, 3350 | "requires": { 3351 | "core-util-is": "~1.0.0", 3352 | "inherits": "~2.0.1", 3353 | "isarray": "0.0.1", 3354 | "string_decoder": "~0.10.x" 3355 | } 3356 | }, 3357 | "regex-not": { 3358 | "version": "1.0.2", 3359 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 3360 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 3361 | "requires": { 3362 | "extend-shallow": "^3.0.2", 3363 | "safe-regex": "^1.1.0" 3364 | } 3365 | }, 3366 | "repeat-element": { 3367 | "version": "1.1.3", 3368 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 3369 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" 3370 | }, 3371 | "repeat-string": { 3372 | "version": "1.6.1", 3373 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 3374 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 3375 | }, 3376 | "request": { 3377 | "version": "2.88.0", 3378 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 3379 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 3380 | "requires": { 3381 | "aws-sign2": "~0.7.0", 3382 | "aws4": "^1.8.0", 3383 | "caseless": "~0.12.0", 3384 | "combined-stream": "~1.0.6", 3385 | "extend": "~3.0.2", 3386 | "forever-agent": "~0.6.1", 3387 | "form-data": "~2.3.2", 3388 | "har-validator": "~5.1.0", 3389 | "http-signature": "~1.2.0", 3390 | "is-typedarray": "~1.0.0", 3391 | "isstream": "~0.1.2", 3392 | "json-stringify-safe": "~5.0.1", 3393 | "mime-types": "~2.1.19", 3394 | "oauth-sign": "~0.9.0", 3395 | "performance-now": "^2.1.0", 3396 | "qs": "~6.5.2", 3397 | "safe-buffer": "^5.1.2", 3398 | "tough-cookie": "~2.4.3", 3399 | "tunnel-agent": "^0.6.0", 3400 | "uuid": "^3.3.2" 3401 | } 3402 | }, 3403 | "resolve-url": { 3404 | "version": "0.2.1", 3405 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 3406 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 3407 | }, 3408 | "ret": { 3409 | "version": "0.1.15", 3410 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 3411 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 3412 | }, 3413 | "retry-axios": { 3414 | "version": "0.3.2", 3415 | "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz", 3416 | "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==" 3417 | }, 3418 | "retry-request": { 3419 | "version": "4.0.0", 3420 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz", 3421 | "integrity": "sha512-S4HNLaWcMP6r8E4TMH52Y7/pM8uNayOcTDDQNBwsCccL1uI+Ol2TljxRDPzaNfbhOB30+XWP5NnZkB3LiJxi1w==", 3422 | "requires": { 3423 | "through2": "^2.0.0" 3424 | } 3425 | }, 3426 | "safe-buffer": { 3427 | "version": "5.1.2", 3428 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3429 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 3430 | }, 3431 | "safe-regex": { 3432 | "version": "1.1.0", 3433 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 3434 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 3435 | "requires": { 3436 | "ret": "~0.1.10" 3437 | } 3438 | }, 3439 | "safer-buffer": { 3440 | "version": "2.1.2", 3441 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3442 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 3443 | }, 3444 | "semver": { 3445 | "version": "5.5.1", 3446 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", 3447 | "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" 3448 | }, 3449 | "send": { 3450 | "version": "0.16.2", 3451 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 3452 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 3453 | "requires": { 3454 | "debug": "2.6.9", 3455 | "depd": "~1.1.2", 3456 | "destroy": "~1.0.4", 3457 | "encodeurl": "~1.0.2", 3458 | "escape-html": "~1.0.3", 3459 | "etag": "~1.8.1", 3460 | "fresh": "0.5.2", 3461 | "http-errors": "~1.6.2", 3462 | "mime": "1.4.1", 3463 | "ms": "2.0.0", 3464 | "on-finished": "~2.3.0", 3465 | "range-parser": "~1.2.0", 3466 | "statuses": "~1.4.0" 3467 | }, 3468 | "dependencies": { 3469 | "mime": { 3470 | "version": "1.4.1", 3471 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 3472 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 3473 | } 3474 | } 3475 | }, 3476 | "serve-static": { 3477 | "version": "1.13.2", 3478 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 3479 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 3480 | "requires": { 3481 | "encodeurl": "~1.0.2", 3482 | "escape-html": "~1.0.3", 3483 | "parseurl": "~1.3.2", 3484 | "send": "0.16.2" 3485 | } 3486 | }, 3487 | "set-value": { 3488 | "version": "2.0.0", 3489 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", 3490 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", 3491 | "requires": { 3492 | "extend-shallow": "^2.0.1", 3493 | "is-extendable": "^0.1.1", 3494 | "is-plain-object": "^2.0.3", 3495 | "split-string": "^3.0.1" 3496 | }, 3497 | "dependencies": { 3498 | "extend-shallow": { 3499 | "version": "2.0.1", 3500 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 3501 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3502 | "requires": { 3503 | "is-extendable": "^0.1.0" 3504 | } 3505 | } 3506 | } 3507 | }, 3508 | "setprototypeof": { 3509 | "version": "1.1.0", 3510 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 3511 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 3512 | }, 3513 | "signal-exit": { 3514 | "version": "3.0.2", 3515 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3516 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 3517 | }, 3518 | "slash": { 3519 | "version": "1.0.0", 3520 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 3521 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 3522 | }, 3523 | "snakeize": { 3524 | "version": "0.1.0", 3525 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 3526 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" 3527 | }, 3528 | "snapdragon": { 3529 | "version": "0.8.2", 3530 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 3531 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 3532 | "requires": { 3533 | "base": "^0.11.1", 3534 | "debug": "^2.2.0", 3535 | "define-property": "^0.2.5", 3536 | "extend-shallow": "^2.0.1", 3537 | "map-cache": "^0.2.2", 3538 | "source-map": "^0.5.6", 3539 | "source-map-resolve": "^0.5.0", 3540 | "use": "^3.1.0" 3541 | }, 3542 | "dependencies": { 3543 | "define-property": { 3544 | "version": "0.2.5", 3545 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 3546 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3547 | "requires": { 3548 | "is-descriptor": "^0.1.0" 3549 | } 3550 | }, 3551 | "extend-shallow": { 3552 | "version": "2.0.1", 3553 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 3554 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3555 | "requires": { 3556 | "is-extendable": "^0.1.0" 3557 | } 3558 | } 3559 | } 3560 | }, 3561 | "snapdragon-node": { 3562 | "version": "2.1.1", 3563 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 3564 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 3565 | "requires": { 3566 | "define-property": "^1.0.0", 3567 | "isobject": "^3.0.0", 3568 | "snapdragon-util": "^3.0.1" 3569 | }, 3570 | "dependencies": { 3571 | "define-property": { 3572 | "version": "1.0.0", 3573 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 3574 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 3575 | "requires": { 3576 | "is-descriptor": "^1.0.0" 3577 | } 3578 | }, 3579 | "is-accessor-descriptor": { 3580 | "version": "1.0.0", 3581 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 3582 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 3583 | "requires": { 3584 | "kind-of": "^6.0.0" 3585 | } 3586 | }, 3587 | "is-data-descriptor": { 3588 | "version": "1.0.0", 3589 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 3590 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 3591 | "requires": { 3592 | "kind-of": "^6.0.0" 3593 | } 3594 | }, 3595 | "is-descriptor": { 3596 | "version": "1.0.2", 3597 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 3598 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 3599 | "requires": { 3600 | "is-accessor-descriptor": "^1.0.0", 3601 | "is-data-descriptor": "^1.0.0", 3602 | "kind-of": "^6.0.2" 3603 | } 3604 | } 3605 | } 3606 | }, 3607 | "snapdragon-util": { 3608 | "version": "3.0.1", 3609 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 3610 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 3611 | "requires": { 3612 | "kind-of": "^3.2.0" 3613 | }, 3614 | "dependencies": { 3615 | "kind-of": { 3616 | "version": "3.2.2", 3617 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3618 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3619 | "requires": { 3620 | "is-buffer": "^1.1.5" 3621 | } 3622 | } 3623 | } 3624 | }, 3625 | "source-map": { 3626 | "version": "0.5.7", 3627 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 3628 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 3629 | }, 3630 | "source-map-resolve": { 3631 | "version": "0.5.2", 3632 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 3633 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 3634 | "requires": { 3635 | "atob": "^2.1.1", 3636 | "decode-uri-component": "^0.2.0", 3637 | "resolve-url": "^0.2.1", 3638 | "source-map-url": "^0.4.0", 3639 | "urix": "^0.1.0" 3640 | } 3641 | }, 3642 | "source-map-url": { 3643 | "version": "0.4.0", 3644 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 3645 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 3646 | }, 3647 | "split-array-stream": { 3648 | "version": "2.0.0", 3649 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 3650 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 3651 | "requires": { 3652 | "is-stream-ended": "^0.1.4" 3653 | } 3654 | }, 3655 | "split-string": { 3656 | "version": "3.1.0", 3657 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 3658 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 3659 | "requires": { 3660 | "extend-shallow": "^3.0.0" 3661 | } 3662 | }, 3663 | "sshpk": { 3664 | "version": "1.14.2", 3665 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 3666 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 3667 | "requires": { 3668 | "asn1": "~0.2.3", 3669 | "assert-plus": "^1.0.0", 3670 | "bcrypt-pbkdf": "^1.0.0", 3671 | "dashdash": "^1.12.0", 3672 | "ecc-jsbn": "~0.1.1", 3673 | "getpass": "^0.1.1", 3674 | "jsbn": "~0.1.0", 3675 | "safer-buffer": "^2.0.2", 3676 | "tweetnacl": "~0.14.0" 3677 | } 3678 | }, 3679 | "static-extend": { 3680 | "version": "0.1.2", 3681 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 3682 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 3683 | "requires": { 3684 | "define-property": "^0.2.5", 3685 | "object-copy": "^0.1.0" 3686 | }, 3687 | "dependencies": { 3688 | "define-property": { 3689 | "version": "0.2.5", 3690 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 3691 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3692 | "requires": { 3693 | "is-descriptor": "^0.1.0" 3694 | } 3695 | } 3696 | } 3697 | }, 3698 | "statuses": { 3699 | "version": "1.4.0", 3700 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 3701 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 3702 | }, 3703 | "stream-events": { 3704 | "version": "1.0.4", 3705 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.4.tgz", 3706 | "integrity": "sha512-D243NJaYs/xBN2QnoiMDY7IesJFIK7gEhnvAYqJa5JvDdnh2dC4qDBwlCf0ohPpX2QRlA/4gnbnPd3rs3KxVcA==", 3707 | "requires": { 3708 | "stubs": "^3.0.0" 3709 | } 3710 | }, 3711 | "stream-shift": { 3712 | "version": "1.0.0", 3713 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 3714 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 3715 | }, 3716 | "string-format-obj": { 3717 | "version": "1.1.1", 3718 | "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", 3719 | "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==", 3720 | "optional": true 3721 | }, 3722 | "string-width": { 3723 | "version": "1.0.2", 3724 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3725 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3726 | "requires": { 3727 | "code-point-at": "^1.0.0", 3728 | "is-fullwidth-code-point": "^1.0.0", 3729 | "strip-ansi": "^3.0.0" 3730 | } 3731 | }, 3732 | "string_decoder": { 3733 | "version": "0.10.31", 3734 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 3735 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 3736 | "optional": true 3737 | }, 3738 | "stringifier": { 3739 | "version": "1.4.0", 3740 | "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.4.0.tgz", 3741 | "integrity": "sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==", 3742 | "requires": { 3743 | "core-js": "^2.0.0", 3744 | "traverse": "^0.6.6", 3745 | "type-name": "^2.0.1" 3746 | } 3747 | }, 3748 | "strip-ansi": { 3749 | "version": "3.0.1", 3750 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3751 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3752 | "requires": { 3753 | "ansi-regex": "^2.0.0" 3754 | } 3755 | }, 3756 | "stubs": { 3757 | "version": "3.0.0", 3758 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 3759 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" 3760 | }, 3761 | "through2": { 3762 | "version": "2.0.3", 3763 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 3764 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 3765 | "requires": { 3766 | "readable-stream": "^2.1.5", 3767 | "xtend": "~4.0.1" 3768 | }, 3769 | "dependencies": { 3770 | "isarray": { 3771 | "version": "1.0.0", 3772 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3773 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 3774 | }, 3775 | "readable-stream": { 3776 | "version": "2.3.6", 3777 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 3778 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 3779 | "requires": { 3780 | "core-util-is": "~1.0.0", 3781 | "inherits": "~2.0.3", 3782 | "isarray": "~1.0.0", 3783 | "process-nextick-args": "~2.0.0", 3784 | "safe-buffer": "~5.1.1", 3785 | "string_decoder": "~1.1.1", 3786 | "util-deprecate": "~1.0.1" 3787 | } 3788 | }, 3789 | "string_decoder": { 3790 | "version": "1.1.1", 3791 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3792 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3793 | "requires": { 3794 | "safe-buffer": "~5.1.0" 3795 | } 3796 | } 3797 | } 3798 | }, 3799 | "to-object-path": { 3800 | "version": "0.3.0", 3801 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 3802 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 3803 | "requires": { 3804 | "kind-of": "^3.0.2" 3805 | }, 3806 | "dependencies": { 3807 | "kind-of": { 3808 | "version": "3.2.2", 3809 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3810 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3811 | "requires": { 3812 | "is-buffer": "^1.1.5" 3813 | } 3814 | } 3815 | } 3816 | }, 3817 | "to-regex": { 3818 | "version": "3.0.2", 3819 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 3820 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 3821 | "requires": { 3822 | "define-property": "^2.0.2", 3823 | "extend-shallow": "^3.0.2", 3824 | "regex-not": "^1.0.2", 3825 | "safe-regex": "^1.1.0" 3826 | } 3827 | }, 3828 | "to-regex-range": { 3829 | "version": "2.1.1", 3830 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 3831 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3832 | "requires": { 3833 | "is-number": "^3.0.0", 3834 | "repeat-string": "^1.6.1" 3835 | } 3836 | }, 3837 | "tough-cookie": { 3838 | "version": "2.4.3", 3839 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3840 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3841 | "requires": { 3842 | "psl": "^1.1.24", 3843 | "punycode": "^1.4.1" 3844 | } 3845 | }, 3846 | "traverse": { 3847 | "version": "0.6.6", 3848 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", 3849 | "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" 3850 | }, 3851 | "tslib": { 3852 | "version": "1.9.0", 3853 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", 3854 | "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" 3855 | }, 3856 | "tunnel-agent": { 3857 | "version": "0.6.0", 3858 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3859 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3860 | "requires": { 3861 | "safe-buffer": "^5.0.1" 3862 | } 3863 | }, 3864 | "tweetnacl": { 3865 | "version": "0.14.5", 3866 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3867 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3868 | "optional": true 3869 | }, 3870 | "type-is": { 3871 | "version": "1.6.16", 3872 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 3873 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 3874 | "requires": { 3875 | "media-typer": "0.3.0", 3876 | "mime-types": "~2.1.18" 3877 | } 3878 | }, 3879 | "type-name": { 3880 | "version": "2.0.2", 3881 | "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", 3882 | "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" 3883 | }, 3884 | "typedarray": { 3885 | "version": "0.0.6", 3886 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3887 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 3888 | }, 3889 | "union-value": { 3890 | "version": "1.0.0", 3891 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", 3892 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 3893 | "requires": { 3894 | "arr-union": "^3.1.0", 3895 | "get-value": "^2.0.6", 3896 | "is-extendable": "^0.1.1", 3897 | "set-value": "^0.4.3" 3898 | }, 3899 | "dependencies": { 3900 | "extend-shallow": { 3901 | "version": "2.0.1", 3902 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 3903 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3904 | "requires": { 3905 | "is-extendable": "^0.1.0" 3906 | } 3907 | }, 3908 | "set-value": { 3909 | "version": "0.4.3", 3910 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", 3911 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 3912 | "requires": { 3913 | "extend-shallow": "^2.0.1", 3914 | "is-extendable": "^0.1.1", 3915 | "is-plain-object": "^2.0.1", 3916 | "to-object-path": "^0.3.0" 3917 | } 3918 | } 3919 | } 3920 | }, 3921 | "unique-string": { 3922 | "version": "1.0.0", 3923 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 3924 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 3925 | "requires": { 3926 | "crypto-random-string": "^1.0.0" 3927 | } 3928 | }, 3929 | "universal-deep-strict-equal": { 3930 | "version": "1.2.2", 3931 | "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", 3932 | "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", 3933 | "requires": { 3934 | "array-filter": "^1.0.0", 3935 | "indexof": "0.0.1", 3936 | "object-keys": "^1.0.0" 3937 | } 3938 | }, 3939 | "unpipe": { 3940 | "version": "1.0.0", 3941 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3942 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3943 | }, 3944 | "unset-value": { 3945 | "version": "1.0.0", 3946 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 3947 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3948 | "requires": { 3949 | "has-value": "^0.3.1", 3950 | "isobject": "^3.0.0" 3951 | }, 3952 | "dependencies": { 3953 | "has-value": { 3954 | "version": "0.3.1", 3955 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 3956 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3957 | "requires": { 3958 | "get-value": "^2.0.3", 3959 | "has-values": "^0.1.4", 3960 | "isobject": "^2.0.0" 3961 | }, 3962 | "dependencies": { 3963 | "isobject": { 3964 | "version": "2.1.0", 3965 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 3966 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3967 | "requires": { 3968 | "isarray": "1.0.0" 3969 | } 3970 | } 3971 | } 3972 | }, 3973 | "has-values": { 3974 | "version": "0.1.4", 3975 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 3976 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 3977 | }, 3978 | "isarray": { 3979 | "version": "1.0.0", 3980 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3981 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 3982 | } 3983 | } 3984 | }, 3985 | "urix": { 3986 | "version": "0.1.0", 3987 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 3988 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 3989 | }, 3990 | "use": { 3991 | "version": "3.1.1", 3992 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 3993 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" 3994 | }, 3995 | "util-deprecate": { 3996 | "version": "1.0.2", 3997 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3998 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3999 | }, 4000 | "utils-merge": { 4001 | "version": "1.0.1", 4002 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 4003 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 4004 | }, 4005 | "uuid": { 4006 | "version": "3.3.2", 4007 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 4008 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 4009 | }, 4010 | "uuid-v4": { 4011 | "version": "0.1.0", 4012 | "resolved": "https://registry.npmjs.org/uuid-v4/-/uuid-v4-0.1.0.tgz", 4013 | "integrity": "sha1-YtezEEBvbOz+oVKMafHo4LzsWjo=" 4014 | }, 4015 | "vary": { 4016 | "version": "1.1.2", 4017 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 4018 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 4019 | }, 4020 | "verror": { 4021 | "version": "1.10.0", 4022 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 4023 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 4024 | "requires": { 4025 | "assert-plus": "^1.0.0", 4026 | "core-util-is": "1.0.2", 4027 | "extsprintf": "^1.2.0" 4028 | } 4029 | }, 4030 | "websocket-driver": { 4031 | "version": "0.7.0", 4032 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", 4033 | "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", 4034 | "requires": { 4035 | "http-parser-js": ">=0.4.0", 4036 | "websocket-extensions": ">=0.1.1" 4037 | } 4038 | }, 4039 | "websocket-extensions": { 4040 | "version": "0.1.3", 4041 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", 4042 | "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" 4043 | }, 4044 | "which": { 4045 | "version": "1.3.1", 4046 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 4047 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 4048 | "requires": { 4049 | "isexe": "^2.0.0" 4050 | } 4051 | }, 4052 | "window-size": { 4053 | "version": "0.1.4", 4054 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 4055 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", 4056 | "optional": true 4057 | }, 4058 | "wrap-ansi": { 4059 | "version": "2.1.0", 4060 | "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 4061 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 4062 | "optional": true, 4063 | "requires": { 4064 | "string-width": "^1.0.1", 4065 | "strip-ansi": "^3.0.1" 4066 | } 4067 | }, 4068 | "wrappy": { 4069 | "version": "1.0.2", 4070 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 4071 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 4072 | }, 4073 | "write-file-atomic": { 4074 | "version": "2.3.0", 4075 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 4076 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 4077 | "requires": { 4078 | "graceful-fs": "^4.1.11", 4079 | "imurmurhash": "^0.1.4", 4080 | "signal-exit": "^3.0.2" 4081 | } 4082 | }, 4083 | "xdg-basedir": { 4084 | "version": "3.0.0", 4085 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 4086 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" 4087 | }, 4088 | "xmlhttprequest": { 4089 | "version": "1.8.0", 4090 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 4091 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 4092 | }, 4093 | "xtend": { 4094 | "version": "4.0.1", 4095 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 4096 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 4097 | }, 4098 | "y18n": { 4099 | "version": "3.2.1", 4100 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 4101 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 4102 | "optional": true 4103 | }, 4104 | "yallist": { 4105 | "version": "2.1.2", 4106 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 4107 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 4108 | }, 4109 | "yargs": { 4110 | "version": "3.32.0", 4111 | "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 4112 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 4113 | "optional": true, 4114 | "requires": { 4115 | "camelcase": "^2.0.1", 4116 | "cliui": "^3.0.3", 4117 | "decamelize": "^1.1.1", 4118 | "os-locale": "^1.4.0", 4119 | "string-width": "^1.0.1", 4120 | "window-size": "^0.1.4", 4121 | "y18n": "^3.2.0" 4122 | } 4123 | } 4124 | } 4125 | } 4126 | -------------------------------------------------------------------------------- /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 | "engines": { 12 | "node": "8" 13 | }, 14 | "dependencies": { 15 | "@google-cloud/storage": "^2.0.3", 16 | "ffmpeg-static": "^2.3.0", 17 | "firebase-admin": "~6.0.0", 18 | "firebase-functions": "^2.0.3", 19 | "fluent-ffmpeg": "^2.1.2", 20 | "uuid-v4": "^0.1.0" 21 | }, 22 | "private": true 23 | } 24 | -------------------------------------------------------------------------------- /functions/saveUser.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | const serviceAccount = require('./config/service_account.json'); 3 | const admin = require('firebase-admin'); 4 | try { 5 | admin.initializeApp({ 6 | credential: admin.credential.cert(serviceAccount), 7 | databaseURL: "https://fir-reacty-videos.firebaseio.com" 8 | }); 9 | admin.firestore().settings({timestampsInSnapshots: true}); 10 | } catch (error) { 11 | console.log(error); 12 | } 13 | 14 | const defaultUserIcon = 'https://firebasestorage.googleapis.com/v0/b/fir-clone-1a266.appspot.com/o/default-user-icons%2F1.png?alt=media&token=b5e090f4-d2b1-4544-92bd-379a3d22b470' 15 | 16 | exports.saveUser = functions.auth.user().onCreate(async user => { 17 | try { 18 | const result = await admin.firestore().doc(`users/${user.uid}`).create({ 19 | uid: user.uid, 20 | displayName: user.displayName || '名無しさん', 21 | email: user.email, 22 | emailVerified: user.emailVerified, 23 | photoURL: user.photoURL || defaultUserIcon, 24 | phoneNumber: user.phoneNumber, 25 | providerData: { 26 | providerId: user.providerData.length === 0 ? 'password' : user.providerData[0].providerId, 27 | uid: user.providerData.length === 0 ? user.email : user.providerData[0].uid 28 | }, 29 | disabled: user.disabled 30 | }); 31 | 32 | console.log(`Save User info! Document written at: ${result.writeTime.toDate()}`); 33 | } catch (error) { 34 | console.log(error); 35 | } 36 | }); -------------------------------------------------------------------------------- /functions/transcodeVideo.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | const path = require('path'); 3 | const os = require('os'); 4 | const fs = require('fs'); 5 | const ffmpeg = require('fluent-ffmpeg'); 6 | const ffmpeg_static = require('ffmpeg-static'); 7 | const UUID = require('uuid-v4'); 8 | const serviceAccount = require('./config/service_account.json'); 9 | 10 | const {Storage} = require('@google-cloud/storage'); 11 | const gcs = new Storage({keyFilename: './config/service_account.json'}); 12 | 13 | const admin = require('firebase-admin'); 14 | try { 15 | admin.initializeApp({ 16 | credential: admin.credential.cert(serviceAccount), 17 | databaseURL: "https://fir-reacty-videos.firebaseio.com" 18 | }); 19 | admin.firestore().settings({timestampsInSnapshots: true}); 20 | } catch (error) { 21 | console.log(error); 22 | } 23 | 24 | function promisifyCommand(command) { 25 | return new Promise((resolve, reject) => { 26 | command.on('end', resolve).on('error', reject).run(); 27 | }); 28 | } 29 | 30 | async function saveVideoMetadata(userToken, metadata) { 31 | const decodedToken = await admin.auth().verifyIdToken(userToken); 32 | const user_id = decodedToken.uid; 33 | const videoRef = admin.firestore().doc(`users/${user_id}`).collection('videos').doc(); 34 | metadata = Object.assign(metadata, { uid: videoRef.id }); 35 | 36 | await videoRef.set(metadata, { merge: true }); 37 | } 38 | 39 | exports.transcodeVideo = functions.storage.object().onFinalize(async object => { 40 | try { 41 | if (!object.contentType.includes('video') || object.contentType.endsWith('mp4')) { 42 | console.log('quit execution!') 43 | return; 44 | } 45 | 46 | const bucketName = object.bucket; 47 | const bucket = gcs.bucket(bucketName); 48 | const filePath = object.name; 49 | const fileName = filePath.split('/').pop(); 50 | const tempFilePath = path.join(os.tmpdir(), fileName); 51 | const videoFile = bucket.file(filePath); 52 | 53 | const targetTempFileName = `${fileName.replace(/\.[^/.]+$/, '')}_output.mp4`; 54 | const targetTempFilePath = path.join(os.tmpdir(), targetTempFileName); 55 | const targetTranscodedFilePath = `transcoded-videos/${targetTempFileName}`; 56 | const targetStorageFilePath = path.join(path.dirname(targetTranscodedFilePath), targetTempFileName); 57 | 58 | await videoFile.download({destination: tempFilePath}); 59 | 60 | const command = ffmpeg(tempFilePath) 61 | .setFfmpegPath(ffmpeg_static.path) 62 | .format('mp4') 63 | .output(targetTempFilePath); 64 | 65 | await promisifyCommand(command); 66 | 67 | const token = UUID(); 68 | await bucket.upload(targetTempFilePath, { 69 | destination: targetStorageFilePath, 70 | metadata: { 71 | contentType: 'video/mp4', 72 | metadata: { 73 | firebaseStorageDownloadTokens: token 74 | } 75 | } 76 | }); 77 | 78 | let transcodedVideoFile = await bucket.file(targetStorageFilePath); 79 | let metadata = await transcodedVideoFile.getMetadata(); 80 | const downloadURL = `https://firebasestorage.googleapis.com/v0/b/${bucketName}/o/${encodeURIComponent(targetTranscodedFilePath)}?alt=media&token=${token}`; 81 | metadata = Object.assign(metadata[0], {downloadURL: downloadURL}); 82 | const userToken = object.metadata.idToken; 83 | 84 | await saveVideoMetadata(userToken, metadata); 85 | 86 | fs.unlinkSync(tempFilePath); 87 | fs.unlinkSync(targetTempFilePath); 88 | 89 | console.log('Transcode execution was finished!'); 90 | } catch (error) { 91 | console.log(error); 92 | return; 93 | } 94 | }); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebase-youtube-clone", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@material-ui/core": "^3.8.3", 7 | "@material-ui/icons": "^3.0.2", 8 | "firebase": "^5.7.3", 9 | "react": "^16.7.0", 10 | "react-dom": "^16.7.0", 11 | "react-firebaseui": "^3.1.2", 12 | "react-loading-overlay": "^1.0.1", 13 | "react-redux": "5.1.1", 14 | "react-redux-firebase": "^2.2.6", 15 | "react-router-dom": "^4.3.1", 16 | "react-scripts": "2.1.2", 17 | "redux": "^4.0.1", 18 | "redux-firestore": "^0.6.2", 19 | "redux-thunk": "^2.3.0", 20 | "video-react": "^0.13.2" 21 | }, 22 | "scripts": { 23 | "start": "react-scripts start", 24 | "build": "react-scripts build", 25 | "test": "react-scripts test --env=jsdom", 26 | "eject": "react-scripts eject" 27 | }, 28 | "browserslist": [ 29 | ">0.2%", 30 | "not dead", 31 | "not ie <= 11", 32 | "not op_mini all" 33 | ], 34 | "devDependencies": { 35 | "redux-devtools-extension": "^2.13.7" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samuraikun/firebase-youtube-clone/1436f54f2499b2c7cb6cfd409e220f7b60950996/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | Firebase Videos 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /src/actions/asyncActions.js: -------------------------------------------------------------------------------- 1 | import { ASYNC_ACTION_START, ASYNC_ACTION_FINISH, ASYNC_ACTION_ERROR } from '../constants/actionTypes'; 2 | 3 | export const asyncActionStart = () => { 4 | return { 5 | type: ASYNC_ACTION_START 6 | } 7 | } 8 | 9 | export const asyncActionFinish = () => { 10 | return { 11 | type: ASYNC_ACTION_FINISH 12 | } 13 | } 14 | 15 | export const asyncActionError = () => { 16 | return { 17 | type: ASYNC_ACTION_ERROR 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/actions/videoActions.js: -------------------------------------------------------------------------------- 1 | import { FETCH_VIDEOS } from '../constants/actionTypes'; 2 | import { asyncActionStart, asyncActionFinish, asyncActionError } from '../actions/asyncActions'; 3 | import firebase from '../config/firebase'; 4 | 5 | export const fetchVideos = () => async dispatch => { 6 | let videos = []; 7 | const firestore = firebase.firestore(); 8 | 9 | try { 10 | dispatch(asyncActionStart()); 11 | 12 | const querySnapshot = await firestore.collection('videos').limit(50).get(); 13 | 14 | await querySnapshot.forEach(doc => { 15 | videos.push(doc.data()); 16 | }); 17 | 18 | dispatch({ type: FETCH_VIDEOS, payload: { videos } }); 19 | dispatch(asyncActionFinish()); 20 | } catch (error) { 21 | console.log(error); 22 | dispatch(asyncActionError()); 23 | } 24 | } -------------------------------------------------------------------------------- /src/components/App.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'; 3 | import Header from './Header'; 4 | import VideoUpload from './VideoUpload'; 5 | import VideosContainer from '../containers/videosContainer'; 6 | 7 | class App extends Component { 8 | render() { 9 | return ( 10 | 11 |
12 |
13 | 14 | 15 | 16 | 17 |
18 |
19 | ); 20 | } 21 | } 22 | 23 | export default App; -------------------------------------------------------------------------------- /src/components/AuthButton.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import AuthModal from './AuthModal'; 5 | import Button from '@material-ui/core/Button'; 6 | 7 | const styles = theme => ({ 8 | button: { 9 | margin: theme.spacing.unit, 10 | }, 11 | }); 12 | 13 | class AuthButton extends Component { 14 | constructor(props) { 15 | super(props); 16 | 17 | this.state = { visibleModal: false, title: '' } 18 | } 19 | 20 | openModal = modalTitle => { 21 | this.setState({ visibleModal: true, title: modalTitle }); 22 | } 23 | 24 | closeModal = () => { 25 | this.setState({ visibleModal: false, modalTitle: '' }); 26 | } 27 | 28 | render() { 29 | const { classes } = this.props; 30 | 31 | return ( 32 |
33 | 34 | 35 | 40 |
41 | ); 42 | } 43 | } 44 | 45 | AuthButton.propTypes = { 46 | classes: PropTypes.object.isRequired, 47 | }; 48 | 49 | export default withStyles(styles)(AuthButton); 50 | -------------------------------------------------------------------------------- /src/components/AuthModal.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import { 5 | Dialog, 6 | DialogTitle, 7 | DialogContent 8 | } from '@material-ui/core'; 9 | import StyledFirebaseAuth from 'react-firebaseui/StyledFirebaseAuth'; 10 | import firebase from 'firebase/app'; 11 | import 'firebase/auth'; 12 | import SignUpForm from './SignUpForm'; 13 | import LoginForm from './LoginForm'; 14 | 15 | const styles = theme => ({ 16 | margin: { 17 | margin: theme.spacing.unit, 18 | }, 19 | dialogTitle: { 20 | textAlign: 'center' 21 | }, 22 | authBasicForm: { 23 | textAlign: 'center' 24 | } 25 | }); 26 | 27 | const uiConfig = { 28 | signInFlow: 'popup', 29 | signInSuccessUrl: '/', 30 | signInOptions: [ 31 | firebase.auth.GoogleAuthProvider.PROVIDER_ID, 32 | firebase.auth.FacebookAuthProvider.PROVIDER_ID 33 | ] 34 | }; 35 | 36 | class AuthModal extends Component { 37 | state = { 38 | open: false, 39 | } 40 | 41 | handleClose = () => { 42 | this.props.onClose(); 43 | } 44 | 45 | render() { 46 | const { classes, onClose, title, ...other } = this.props; 47 | 48 | return ( 49 | 54 | {title} 55 | 56 |
57 | {title === '登録' ? : } 58 |
59 | 60 |
61 |
62 | ); 63 | } 64 | } 65 | 66 | AuthModal.propTypes = { 67 | classes: PropTypes.object.isRequired, 68 | onClose: PropTypes.func, 69 | }; 70 | 71 | export default withStyles(styles)(AuthModal); 72 | -------------------------------------------------------------------------------- /src/components/Header.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import PropTypes from 'prop-types'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | import AppBar from '@material-ui/core/AppBar'; 6 | import Toolbar from '@material-ui/core/Toolbar'; 7 | import Typography from '@material-ui/core/Typography'; 8 | import AuthContainer from '../containers/authContainer'; 9 | 10 | const styles = { 11 | root: { 12 | flexGrow: 1, 13 | }, 14 | flex: { 15 | flexGrow: 1, 16 | }, 17 | link: { 18 | textDecoration: 'none', 19 | color: 'white', 20 | }, 21 | }; 22 | 23 | class Header extends Component { 24 | render() { 25 | const { classes } = this.props; 26 | 27 | return ( 28 |
29 | 30 | 31 | 32 | Firebase Videos 33 | 34 | 35 | 36 | 37 |
38 | ); 39 | } 40 | } 41 | 42 | Header.propTypes = { 43 | classes: PropTypes.object.isRequired, 44 | }; 45 | 46 | export default withStyles(styles)(Header); 47 | -------------------------------------------------------------------------------- /src/components/LoginForm.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import { 5 | FormControl, 6 | TextField, 7 | InputAdornment, 8 | Button 9 | } from '@material-ui/core'; 10 | import { MailOutline, VpnKey } from '@material-ui/icons'; 11 | import firebase from 'firebase/app'; 12 | import 'firebase/auth'; 13 | 14 | const styles = theme => ({ 15 | itemContainer: { 16 | textAlign: 'center' 17 | }, 18 | textField: { 19 | margin: theme.spacing.unit, 20 | }, 21 | submitButton: { 22 | textAlign: 'center', 23 | margin: theme.spacing.unit 24 | } 25 | }); 26 | 27 | class LoginForm extends Component { 28 | state = { 29 | email: '', 30 | password: '' 31 | } 32 | 33 | handleChange = name => event => { 34 | this.setState({ [name]: event.target.value }); 35 | } 36 | 37 | loginWithEmailAndPassword = async (email, password) => { 38 | try { 39 | await firebase.auth().signInWithEmailAndPassword(email, password); 40 | 41 | window.location.href = '/'; 42 | } catch (err) { 43 | switch (err.code) { 44 | case 'auth/email-already-in-use': 45 | window.error = err; 46 | console.log(err); 47 | console.log(err.message); 48 | break; 49 | case 'auth/invalid-email': 50 | window.error = err; 51 | console.log(err); 52 | console.log(err.message); 53 | break; 54 | case 'auth/operation-not-allowed': 55 | window.error = err; 56 | console.log(err); 57 | console.log(err.message); 58 | break; 59 | case 'auth/weak-password': 60 | window.error = err; 61 | console.log(err); 62 | console.log(err.message); 63 | break; 64 | default: 65 | console.log(err); 66 | } 67 | } 68 | } 69 | 70 | render() { 71 | const { classes } = this.props; 72 | 73 | return ( 74 | 75 | 82 | 83 | 84 | ), 85 | }} 86 | onChange={this.handleChange('email')} 87 | /> 88 | 96 | 97 | 98 | ), 99 | }} 100 | onChange={this.handleChange('password')} 101 | /> 102 | 111 | 112 | ); 113 | } 114 | } 115 | 116 | LoginForm.propTypes = { 117 | classes: PropTypes.object.isRequired 118 | }; 119 | 120 | export default withStyles(styles)(LoginForm); 121 | -------------------------------------------------------------------------------- /src/components/NavigationItem.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import UserItem from './UserItem'; 3 | import AuthButton from './AuthButton'; 4 | 5 | const NavigationItem = props => { 6 | const { auth, profile } = props; 7 | const authenticated = auth.isLoaded && !auth.isEmpty; 8 | 9 | const renderAuthButton = () => { 10 | return ( 11 | 12 | ); 13 | } 14 | 15 | const renderUserItem = user => { 16 | return ( 17 | 18 | ); 19 | } 20 | 21 | return ( 22 | authenticated ? renderUserItem(profile) : renderAuthButton() 23 | ); 24 | } 25 | 26 | export default NavigationItem; 27 | -------------------------------------------------------------------------------- /src/components/SignUpForm.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import { 5 | FormControl, 6 | TextField, 7 | InputAdornment, 8 | Button 9 | } from '@material-ui/core'; 10 | import { MailOutline, VpnKey } from '@material-ui/icons'; 11 | import firebase from 'firebase/app'; 12 | import 'firebase/auth'; 13 | 14 | const styles = theme => ({ 15 | itemContainer: { 16 | textAlign: 'center' 17 | }, 18 | textField: { 19 | margin: theme.spacing.unit, 20 | }, 21 | submitButton: { 22 | textAlign: 'center', 23 | margin: theme.spacing.unit 24 | } 25 | }); 26 | 27 | class SignUpForm extends Component { 28 | state = { 29 | email: '', 30 | password: '' 31 | } 32 | 33 | handleChange = name => event => { 34 | this.setState({ [name]: event.target.value }); 35 | } 36 | 37 | signUpWithEmailAndPassword = async (email, password) => { 38 | try { 39 | await firebase.auth().createUserWithEmailAndPassword(email, password); 40 | 41 | window.location.href = '/'; 42 | } catch (err) { 43 | switch (err.code) { 44 | case 'auth/email-already-in-use': 45 | window.error = err; 46 | console.log(err); 47 | console.log(err.message); 48 | break; 49 | case 'auth/invalid-email': 50 | window.error = err; 51 | console.log(err); 52 | console.log(err.message); 53 | break; 54 | case 'auth/operation-not-allowed': 55 | window.error = err; 56 | console.log(err); 57 | console.log(err.message); 58 | break; 59 | case 'auth/weak-password': 60 | window.error = err; 61 | console.log(err); 62 | console.log(err.message); 63 | break; 64 | default: 65 | console.log(err); 66 | } 67 | } 68 | } 69 | 70 | render() { 71 | const { classes } = this.props; 72 | 73 | return ( 74 | 75 | 82 | 83 | 84 | ), 85 | }} 86 | onChange={this.handleChange('email')} 87 | /> 88 | 96 | 97 | 98 | ), 99 | }} 100 | onChange={this.handleChange('password')} 101 | /> 102 | 111 | 112 | ); 113 | } 114 | } 115 | 116 | SignUpForm.propTypes = { 117 | classes: PropTypes.object.isRequired 118 | }; 119 | 120 | export default withStyles(styles)(SignUpForm); 121 | -------------------------------------------------------------------------------- /src/components/UserItem.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import PropTypes from 'prop-types'; 4 | import Button from '@material-ui/core/Button'; 5 | import CloudUploadIcon from '@material-ui/icons/CloudUpload'; 6 | import Avatar from '@material-ui/core/Avatar'; 7 | import firebase from 'firebase/app'; 8 | import 'firebase/auth'; 9 | import { withStyles } from '@material-ui/core'; 10 | 11 | const styles = theme => ({ 12 | button: { 13 | margin: theme.spacing.unit, 14 | }, 15 | rightIcon: { 16 | marginLeft: theme.spacing.unit, 17 | }, 18 | avatar: { 19 | margin: 10, 20 | backgroudColor: 'white', 21 | }, 22 | link: { 23 | textDecoration: 'none', 24 | color: 'white', 25 | }, 26 | }); 27 | 28 | class UserItem extends Component { 29 | googleSignOut = () => { 30 | firebase.auth().signOut() 31 | .then(() => window.location.href = '/'); 32 | } 33 | 34 | render() { 35 | const { classes, user } = this.props; 36 | const defaultUserName = '名無しさん'; 37 | const defaultUserIcon = 'https://firebasestorage.googleapis.com/v0/b/fir-clone-1a266.appspot.com/o/default-user-icons%2F1.png?alt=media&token=b5e090f4-d2b1-4544-92bd-379a3d22b470'; 38 | 39 | return ( 40 |
41 | 45 | 46 | 50 |
51 | ); 52 | } 53 | } 54 | 55 | UserItem.propTypes = { 56 | classes: PropTypes.object.isRequired, 57 | }; 58 | 59 | export default withStyles(styles)(UserItem); 60 | -------------------------------------------------------------------------------- /src/components/VideoFeed.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import PropTypes from 'prop-types'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import Grid from '@material-ui/core/Grid'; 5 | import VideoPlayer from './VideoPlayer'; 6 | 7 | const styles = theme => ({ 8 | root: { 9 | padding: "50px", 10 | }, 11 | }); 12 | 13 | class VideoFeed extends Component { 14 | componentDidMount() { 15 | this.props.fetchVideos(); 16 | } 17 | 18 | renderVideoPlayers(videos) { 19 | return videos.map(video => { 20 | return ( 21 | 22 | 23 | 24 | ); 25 | }); 26 | } 27 | 28 | render() { 29 | const { classes, videos } = this.props; 30 | 31 | return ( 32 | 40 | {this.renderVideoPlayers(videos)} 41 | 42 | ); 43 | } 44 | } 45 | 46 | VideoFeed.propTypes = { 47 | classes: PropTypes.object.isRequired, 48 | }; 49 | 50 | export default withStyles(styles)(VideoFeed); -------------------------------------------------------------------------------- /src/components/VideoPlayer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Player, BigPlayButton } from 'video-react'; 3 | import 'video-react/dist/video-react.css'; 4 | 5 | const VideoPlayer = props => { 6 | return ( 7 | 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | export default VideoPlayer; -------------------------------------------------------------------------------- /src/components/VideoUpload.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import LoadingOverlay from 'react-loading-overlay'; 3 | import firebase from '../config/firebase'; 4 | import _ from 'lodash'; 5 | 6 | class Upload extends Component { 7 | constructor(props) { 8 | super(props); 9 | this.state = { video: null, loading: false } 10 | } 11 | 12 | handleChange = event => { 13 | event.preventDefault(); 14 | const video = event.target.files[0]; 15 | 16 | this.setState({ video }); 17 | } 18 | 19 | handleSubmit = event => { 20 | event.preventDefault(); 21 | 22 | this.setState({ loading: true }); 23 | this.fileUpload(this.state.video); 24 | } 25 | 26 | async fileUpload(video) { 27 | try { 28 | const filePath = `videos/${firebase.auth().currentUser.uid}/${video.name}`; 29 | const videoStorageRef = firebase.storage().ref(filePath); 30 | const idToken = await firebase.auth().currentUser.getIdToken(true); 31 | const metadataForStorage = { 32 | customMetadata: { 33 | idToken: idToken 34 | } 35 | } 36 | const fileSnapshot = await videoStorageRef.put(video, metadataForStorage); 37 | 38 | // mp4以外の動画は、Cloud Functions上で、トランスコードした後に 39 | // メタデータを Firestore に保存する 40 | if (video.type === 'video/mp4') { 41 | const downloadURL = await videoStorageRef.getDownloadURL(); 42 | let metadataForFirestore = _.omitBy(fileSnapshot.metadata, _.isEmpty); 43 | metadataForFirestore = Object.assign(metadataForFirestore, {downloadURL: downloadURL}); 44 | 45 | await this.saveVideoMetadata(metadataForFirestore); 46 | } 47 | 48 | if (fileSnapshot.state === 'success') { 49 | console.log(fileSnapshot); 50 | 51 | this.setState({ video: null, loading: false }); 52 | } else { 53 | console.log(fileSnapshot); 54 | 55 | this.setState({ video: null, loading: false }); 56 | alert('ファイルのアップロードに失敗しました!'); 57 | } 58 | } catch(error) { 59 | console.log(error); 60 | 61 | return; 62 | } 63 | } 64 | 65 | async saveVideoMetadata(metadata) { 66 | const user_id = firebase.auth().currentUser.uid; 67 | const videoRef = firebase.firestore().doc(`users/${user_id}`).collection('videos').doc(); 68 | metadata = Object.assign(metadata, { uid: videoRef.id }); 69 | 70 | await videoRef.set(metadata, { merge: true }); 71 | } 72 | 73 | render() { 74 | return ( 75 | 80 |
this.handleSubmit(e)}> 81 |

Video Upload

82 | this.handleChange(e)} 86 | /> 87 | 88 |
89 |
90 | ); 91 | } 92 | } 93 | 94 | export default Upload; -------------------------------------------------------------------------------- /src/config/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import 'firebase/app'; 3 | import 'firebase/auth'; 4 | import 'firebase/firestore'; 5 | import 'firebase/storage'; 6 | 7 | const firebaseConfig = { 8 | apiKey: "AIzaSyC06ZhCbzvOLVDaURdvs-E6ZeLLnVryVS0", 9 | authDomain: "fir-clone-1a266.firebaseapp.com", 10 | databaseURL: "https://fir-clone-1a266.firebaseio.com", 11 | projectId: "fir-clone-1a266", 12 | storageBucket: "fir-clone-1a266.appspot.com", 13 | messagingSenderId: "393502572886" 14 | }; 15 | 16 | firebase.initializeApp(firebaseConfig); 17 | const firestore = firebase.firestore(); 18 | firestore.settings({ 19 | timestampsInSnapshots: true 20 | }); 21 | 22 | export default firebase; 23 | -------------------------------------------------------------------------------- /src/constants/actionTypes.js: -------------------------------------------------------------------------------- 1 | // Video Actions 2 | export const FETCH_VIDEOS = 'FETCH_VIDEOS'; 3 | 4 | // Async Actions 5 | export const ASYNC_ACTION_START = 'ASYNC_ACTION_START'; 6 | export const ASYNC_ACTION_FINISH = 'ASYNC_ACTION_FINISH'; 7 | export const ASYNC_ACTION_ERROR = 'ASYNC_ACTION_ERROR'; 8 | -------------------------------------------------------------------------------- /src/containers/authContainer.jsx: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import NavigationItem from '../components/NavigationItem'; 3 | 4 | const mapStateToProps = state => ({ 5 | auth: state.firebase.auth, 6 | profile: state.firebase.profile 7 | }); 8 | 9 | export default connect(mapStateToProps)(NavigationItem); 10 | -------------------------------------------------------------------------------- /src/containers/videosContainer.jsx: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | import { fetchVideos } from '../actions/videoActions'; 3 | import VideoFeed from '../components/VideoFeed'; 4 | 5 | const mapStateToProps = state => ({ 6 | videos: state.videos, 7 | loading: state.async.loading 8 | }); 9 | 10 | const actions = { 11 | fetchVideos 12 | } 13 | 14 | export default connect(mapStateToProps, actions)(VideoFeed); 15 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import { Provider } from 'react-redux'; 4 | import { store } from './store'; 5 | import App from './components/App'; 6 | import registerServiceWorker from './registerServiceWorker'; 7 | 8 | const rootElement = document.getElementById('root'); 9 | 10 | const render = () => { 11 | ReactDOM.render( 12 | 13 | 14 | 15 | , 16 | rootElement 17 | ); 18 | } 19 | 20 | if (module.hot) { 21 | module.hot.accept('./components/App', () => { 22 | setTimeout(render); 23 | }); 24 | } 25 | 26 | render(); 27 | 28 | registerServiceWorker(); 29 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/reducers/asyncReducer.js: -------------------------------------------------------------------------------- 1 | import { createReducer } from '../utils/reducerUtil'; 2 | import { ASYNC_ACTION_START, ASYNC_ACTION_FINISH, ASYNC_ACTION_ERROR } from '../constants/actionTypes'; 3 | 4 | const initialState = { 5 | loading: false 6 | } 7 | 8 | export const asyncActionStarted = state => { 9 | return {...state, loading: true} 10 | } 11 | 12 | export const asyncActionFinished = state => { 13 | return {...state, loading: false} 14 | } 15 | 16 | export const asyncActionError = state => { 17 | return {...state, loading: false} 18 | } 19 | 20 | export default createReducer(initialState, { 21 | [ASYNC_ACTION_START]: asyncActionStarted, 22 | [ASYNC_ACTION_FINISH]: asyncActionFinished, 23 | [ASYNC_ACTION_ERROR]: asyncActionError 24 | }); -------------------------------------------------------------------------------- /src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import { firebaseReducer } from 'react-redux-firebase'; 3 | import { firestoreReducer } from 'redux-firestore'; 4 | import asyncReducer from './asyncReducer'; 5 | import videoReducer from './videoReducer'; 6 | 7 | const rootReducer = combineReducers({ 8 | firebase: firebaseReducer, 9 | firestore: firestoreReducer, 10 | videos: videoReducer, 11 | async: asyncReducer 12 | }); 13 | 14 | export default rootReducer; -------------------------------------------------------------------------------- /src/reducers/videoReducer.js: -------------------------------------------------------------------------------- 1 | import { createReducer } from '../utils/reducerUtil'; 2 | import { FETCH_VIDEOS } from '../constants/actionTypes'; 3 | 4 | const initialState = []; 5 | 6 | export const fetchVideos = (state, payload) => { 7 | return payload.videos 8 | } 9 | 10 | export default createReducer(initialState, { 11 | [FETCH_VIDEOS]: fetchVideos 12 | }); 13 | -------------------------------------------------------------------------------- /src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware } from 'redux'; 2 | import { composeWithDevTools } from 'redux-devtools-extension'; 3 | import { reactReduxFirebase, getFirebase } from 'react-redux-firebase'; 4 | import { reduxFirestore, getFirestore } from 'redux-firestore'; 5 | import thunk from 'redux-thunk'; 6 | import rootReducer from './reducers'; 7 | import firebase from './config/firebase'; 8 | 9 | const rrfConfig = { 10 | userProfile: 'users', 11 | useFirestoreForProfile: true, 12 | } 13 | 14 | const middlewares = [thunk.withExtraArgument({getFirebase, getFirestore})]; 15 | const middlewareEnhancer = applyMiddleware(...middlewares); 16 | const storeEnhancers = [middlewareEnhancer]; 17 | 18 | export const store = createStore( 19 | rootReducer, 20 | composeWithDevTools( 21 | ...storeEnhancers, 22 | reactReduxFirebase(firebase, rrfConfig), 23 | reduxFirestore(firebase) 24 | ) 25 | ); 26 | -------------------------------------------------------------------------------- /src/utils/reducerUtil.js: -------------------------------------------------------------------------------- 1 | export const createReducer = (initialState, fnMap) => { 2 | return (state = initialState, {type, payload}) => { 3 | const handler = fnMap[type] 4 | 5 | return handler ? handler(state, payload) : state 6 | } 7 | } -------------------------------------------------------------------------------- /storage.rules: -------------------------------------------------------------------------------- 1 | service firebase.storage { 2 | match /b/{bucket}/o { 3 | match /{allPaths=**} { 4 | allow read, write: if request.auth!=null; 5 | } 6 | } 7 | } 8 | --------------------------------------------------------------------------------