├── .expo-shared └── assets.json ├── .firebaserc ├── .gitignore ├── .watchmanconfig ├── App.js ├── README.md ├── app.json ├── assets ├── icon.png └── splash.png ├── babel.config.js ├── firebase.json ├── functions ├── .gitignore ├── index.js ├── package.json ├── todos.js └── yarn.lock ├── package.json ├── src ├── api.js ├── colors.js ├── components │ ├── Header.js │ └── TodoList.js └── store │ ├── actions.js │ └── store.js └── yarn.lock /.expo-shared/assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "f25c14ed382f3ad75b737a180b448856d9a619f75126054467df25dd9d114a09": true, 3 | "2499d383eaf540c7848d87d42a7640c2fe86976e7582caf0ba86b9a01d1b12b7": true 4 | } -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "redux-observable-todos" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | .expo/* 3 | npm-debug.* 4 | *.jks 5 | *.p8 6 | *.p12 7 | *.key 8 | *.mobileprovision 9 | *.orig.* 10 | web-build/ 11 | web-report/ 12 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { StyleSheet, Text, View } from "react-native"; 3 | import { Provider } from "react-redux"; 4 | import { store } from "./src/store/store"; 5 | import Header from "./src/components/Header"; 6 | import TodoList from "./src/components/TodoList"; 7 | 8 | export default function App() { 9 | return ( 10 | 11 | 12 |
13 | 14 | 15 | 16 | ); 17 | } 18 | 19 | const styles = StyleSheet.create({ 20 | container: { 21 | flex: 1, 22 | flexDirection: "column", 23 | alignItems: "stretch" 24 | }, 25 | todoList: { 26 | flex: 1 27 | } 28 | }); 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > This code is published as part of the corresponding blog article at the [Toptal Engineering Blog](https://www.toptal.com/react-native/react-redux-rxjs-tutorial) 2 | > 3 | > Visit https://www.toptal.com/blog and subscribe to our newsletter to read more great posts! 4 | 5 |
6 |
7 |
8 | 9 |
10 |
11 |
12 | 13 | Redux Observable Todo 14 | --------------------- 15 | 16 | Sample todo app using redux-observable 17 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "Redux Observable Todo", 4 | "slug": "redux-observable-todo", 5 | "privacy": "public", 6 | "sdkVersion": "34.0.0", 7 | "platforms": [ 8 | "ios", 9 | "android" 10 | ], 11 | "version": "1.0.0", 12 | "orientation": "portrait", 13 | "icon": "./assets/icon.png", 14 | "splash": { 15 | "image": "./assets/splash.png", 16 | "resizeMode": "contain", 17 | "backgroundColor": "#ffffff" 18 | }, 19 | "updates": { 20 | "fallbackToCacheTimeout": 0 21 | }, 22 | "assetBundlePatterns": [ 23 | "./assets/*" 24 | ], 25 | "ios": { 26 | "supportsTablet": true 27 | }, 28 | "description": "Sample app for blog post \"Building reactive apps with Redux and Redux-Observable\"\nSource Code: https://github.com/sourabhv/redux-observable-todo", 29 | "githubUrl": "https://github.com/sourabhv/redux-observable-todo" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourabhv/redux-observable-todo/4169c2af4f03b554bff075d237ef7f7d29a4abe2/assets/icon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourabhv/redux-observable-todo/4169c2af4f03b554bff075d237ef7f7d29a4abe2/assets/splash.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require("firebase-functions"); 2 | const admin = require("firebase-admin"); 3 | admin.initializeApp(); 4 | const express = require("express"); 5 | const bodyParser = require("body-parser"); 6 | const cors = require("cors")({ origin: true }); 7 | const morgan = require("morgan"); 8 | const todosRouter = require("./todos"); 9 | 10 | const app = express(); 11 | app.use(cors); 12 | app.use(bodyParser.urlencoded({ extended: false })); 13 | app.use(bodyParser.json()); 14 | app.use( 15 | morgan(":method :url :status :res[content-length] - :response-time ms") 16 | ); 17 | 18 | app.get("/user", (req, res) => { 19 | res.status(200).send({ 20 | id: "123", 21 | name: "John Doe", 22 | email: "foo@example.com" 23 | }); 24 | }); 25 | 26 | app.use("/todo", todosRouter); 27 | 28 | exports.api = functions.https.onRequest(app); 29 | -------------------------------------------------------------------------------- /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": "10" 13 | }, 14 | "dependencies": { 15 | "body-parser": "^1.19.0", 16 | "cors": "^2.8.5", 17 | "express": "^4.17.1", 18 | "firebase-admin": "^8.0.0", 19 | "firebase-functions": "^3.1.0", 20 | "moment": "^2.24.0", 21 | "morgan": "^1.9.1" 22 | }, 23 | "devDependencies": { 24 | "firebase-functions-test": "^0.1.6" 25 | }, 26 | "private": true 27 | } 28 | -------------------------------------------------------------------------------- /functions/todos.js: -------------------------------------------------------------------------------- 1 | const functions = require("firebase-functions"); 2 | const admin = require("firebase-admin"); 3 | const { Router } = require("express"); 4 | 5 | const todosRef = admin.firestore().collection("todos"); 6 | const router = new Router(); 7 | 8 | router.get("/", async (req, res) => { 9 | const todos = (await todosRef.get()).docs.map(doc => ({ 10 | id: doc.id, 11 | ...doc.data() 12 | })); 13 | if (todos.length > 20) { 14 | await todosRef.doc(todos[0].id).delete(); 15 | const remainingTodos = todos.slice(1); 16 | res.status(200).send({ todos: remainingTodos }); 17 | } else { 18 | res.status(200).send({ todos }); 19 | } 20 | }); 21 | 22 | router.post("/", async (req, res) => { 23 | const doc = todosRef.doc(); 24 | const data = { 25 | text: req.body.text, 26 | completed: !!req.body.completed || false 27 | }; 28 | await doc.set(data); 29 | 30 | res.status(200).send({ 31 | id: doc.id, 32 | ...data 33 | }); 34 | }); 35 | 36 | router.post("/:id/complete", async (req, res) => { 37 | const id = req.params.id; 38 | await todosRef.doc(id).update({ completed: true }); 39 | const todo = (await todosRef.doc(id).get()).data(); 40 | res.status(200).send({ id, ...todo }); 41 | }); 42 | 43 | module.exports = router; 44 | -------------------------------------------------------------------------------- /functions/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@firebase/app-types@0.x": 6 | version "0.4.3" 7 | resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.4.3.tgz#80d2b6e5ee43ac99892329ab02301ee7ed82da45" 8 | integrity sha512-VU5c+ZjejvefLVH4cjiX3Hy1w9HYMv7TtZ1tF9ZmOqT4DSIU1a3VISWoo8///cGGffr5IirMO+Q/WZLI4p8VcA== 9 | 10 | "@firebase/database-types@0.4.3": 11 | version "0.4.3" 12 | resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-0.4.3.tgz#4ee4ada5544f3629fb451e216da8f917a80ae8cd" 13 | integrity sha512-21yCiJA2Tyt6dJYwWeB69MwoawBu5UWNtP6MAY0ugyRBHVdjAMHMYalPxCjZ46LAmhfim0+i8NXRadOFVS3hUA== 14 | dependencies: 15 | "@firebase/app-types" "0.x" 16 | 17 | "@firebase/database@^0.5.1": 18 | version "0.5.2" 19 | resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.5.2.tgz#9f480c64f7a16569ae8cf18ed82b22acf0ea0885" 20 | integrity sha512-LnXKRE1AmjlS+iRF7j8vx+Ni8x85CmLP5u5Pw5rDKhKLn2eTR1tJKD937mUeeGEtDHwR1rrrkLYOqRR2cSG3hQ== 21 | dependencies: 22 | "@firebase/database-types" "0.4.3" 23 | "@firebase/logger" "0.1.24" 24 | "@firebase/util" "0.2.27" 25 | faye-websocket "0.11.3" 26 | tslib "1.10.0" 27 | 28 | "@firebase/logger@0.1.24": 29 | version "0.1.24" 30 | resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.1.24.tgz#770468c9f6c910c0db6008f7dccad88bb1df06d6" 31 | integrity sha512-wPwhWCepEjWiTIqeC9U+7Hcw4XwezKPdXmyXbYSPiWNDcVekNgMPkntwSK+/2ufJO/1nMwAL2n6fL12oQG/PpQ== 32 | 33 | "@firebase/util@0.2.27": 34 | version "0.2.27" 35 | resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.2.27.tgz#6adac01023af835ed44379534b09fd1399f6f469" 36 | integrity sha512-kFlbWNX1OuLfHrDXZ5QLmNNiLtMyxzbBgMo1DY1tXMjKK1AMYsHnyjInA8esvO0SCDp5XN3Pt9EDlhY4sRiLsw== 37 | dependencies: 38 | tslib "1.10.0" 39 | 40 | "@google-cloud/common@^2.1.1": 41 | version "2.1.2" 42 | resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-2.1.2.tgz#cefab7522d652d4ee48ab4719e2fe2d6c117db4c" 43 | integrity sha512-VAjWRrTEgcGujj/MgTTAtjjzeDoQqs/FDT6DG7004QFZoJsSwBmx2vGpI5TJmCuxLWvhEc0Xs5AMOvhgt7FLSw== 44 | dependencies: 45 | "@google-cloud/projectify" "^1.0.0" 46 | "@google-cloud/promisify" "^1.0.0" 47 | arrify "^2.0.0" 48 | duplexify "^3.6.0" 49 | ent "^2.2.0" 50 | extend "^3.0.2" 51 | google-auth-library "^5.0.0" 52 | retry-request "^4.0.0" 53 | teeny-request "^5.2.1" 54 | 55 | "@google-cloud/firestore@^2.0.0": 56 | version "2.3.0" 57 | resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-2.3.0.tgz#079854c58fe43362595d5e54afd577bfc0059909" 58 | integrity sha512-U5t5QSn+mAx9cw5QiIISDIVzICjxZ2o2+Qs/824I7BU6HkcElgxddgTcACF1z1xl2ZXxmz6NSBWmMr23Uhcilg== 59 | dependencies: 60 | bun "^0.0.12" 61 | deep-equal "^1.0.1" 62 | functional-red-black-tree "^1.0.1" 63 | google-gax "^1.1.2" 64 | through2 "^3.0.0" 65 | 66 | "@google-cloud/paginator@^2.0.0": 67 | version "2.0.1" 68 | resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-2.0.1.tgz#89ca97933eecfdd7eaa07bd79ed01c9869c9531b" 69 | integrity sha512-HZ6UTGY/gHGNriD7OCikYWL/Eu0sTEur2qqse2w6OVsz+57se3nTkqH14JIPxtf0vlEJ8IJN5w3BdZ22pjCB8g== 70 | dependencies: 71 | arrify "^2.0.0" 72 | extend "^3.0.2" 73 | 74 | "@google-cloud/projectify@^1.0.0": 75 | version "1.0.1" 76 | resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-1.0.1.tgz#f654c2ea9de923294ec814ff07c42891abf2d143" 77 | integrity sha512-xknDOmsMgOYHksKc1GPbwDLsdej8aRNIA17SlSZgQdyrcC0lx0OGo4VZgYfwoEU1YS8oUxF9Y+6EzDOb0eB7Xg== 78 | 79 | "@google-cloud/promisify@^1.0.0": 80 | version "1.0.2" 81 | resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-1.0.2.tgz#e581aa79ff71fb6074acc1cc59e3d81bf84ce07b" 82 | integrity sha512-7WfV4R/3YV5T30WRZW0lqmvZy9hE2/p9MvpI34WuKa2Wz62mLu5XplGTFEMK6uTbJCLWUxTcZ4J4IyClKucE5g== 83 | 84 | "@google-cloud/storage@^3.0.2": 85 | version "3.2.1" 86 | resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-3.2.1.tgz#6701fbc91b95304e0da88c0f193b1800c9ba4159" 87 | integrity sha512-129EwPGej6bXzY1u5nja2aeMDew6DIHaJn7ZV6nteQ74LQQSNv2jKrqTlyhndBsAwpuwQAxeghPTCoFT/H8Frg== 88 | dependencies: 89 | "@google-cloud/common" "^2.1.1" 90 | "@google-cloud/paginator" "^2.0.0" 91 | "@google-cloud/promisify" "^1.0.0" 92 | arrify "^2.0.0" 93 | compressible "^2.0.12" 94 | concat-stream "^2.0.0" 95 | date-and-time "^0.9.0" 96 | duplexify "^3.5.0" 97 | extend "^3.0.2" 98 | gaxios "^2.0.1" 99 | gcs-resumable-upload "^2.0.0" 100 | hash-stream-validation "^0.2.1" 101 | mime "^2.2.0" 102 | mime-types "^2.0.8" 103 | onetime "^5.1.0" 104 | p-limit "^2.2.0" 105 | pumpify "^2.0.0" 106 | snakeize "^0.1.0" 107 | stream-events "^1.0.1" 108 | through2 "^3.0.0" 109 | xdg-basedir "^4.0.0" 110 | 111 | "@grpc/grpc-js@^0.5.2": 112 | version "0.5.3" 113 | resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-0.5.3.tgz#4896d6c598dcb37c6bd090e7d0e9fa3eaae18fe5" 114 | integrity sha512-doDzxjdN0IJihQJvjDkZun9bZp/TW2EKO5E4fNvw8634kU1eNqPnFtAmiEiIYptqJ9StC+zRo1mwrazhqI0k5A== 115 | dependencies: 116 | semver "^6.2.0" 117 | 118 | "@grpc/proto-loader@^0.5.1": 119 | version "0.5.2" 120 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.2.tgz#c84f83be962f518bc303ca2d5e6ef2239439786c" 121 | integrity sha512-eBKD/FPxQoY1x6QONW2nBd54QUEyzcFP9FenujmoeDPy1rutVSHki1s/wR68F6O1QfCNDx+ayBH1O2CVNMzyyw== 122 | dependencies: 123 | lodash.camelcase "^4.3.0" 124 | protobufjs "^6.8.6" 125 | 126 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 127 | version "1.1.2" 128 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 129 | integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= 130 | 131 | "@protobufjs/base64@^1.1.2": 132 | version "1.1.2" 133 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 134 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 135 | 136 | "@protobufjs/codegen@^2.0.4": 137 | version "2.0.4" 138 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 139 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 140 | 141 | "@protobufjs/eventemitter@^1.1.0": 142 | version "1.1.0" 143 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 144 | integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= 145 | 146 | "@protobufjs/fetch@^1.1.0": 147 | version "1.1.0" 148 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 149 | integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= 150 | dependencies: 151 | "@protobufjs/aspromise" "^1.1.1" 152 | "@protobufjs/inquire" "^1.1.0" 153 | 154 | "@protobufjs/float@^1.0.2": 155 | version "1.0.2" 156 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 157 | integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= 158 | 159 | "@protobufjs/inquire@^1.1.0": 160 | version "1.1.0" 161 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 162 | integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= 163 | 164 | "@protobufjs/path@^1.1.2": 165 | version "1.1.2" 166 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 167 | integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= 168 | 169 | "@protobufjs/pool@^1.1.0": 170 | version "1.1.0" 171 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 172 | integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= 173 | 174 | "@protobufjs/utf8@^1.1.0": 175 | version "1.1.0" 176 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 177 | integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= 178 | 179 | "@types/body-parser@*": 180 | version "1.17.1" 181 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897" 182 | integrity sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w== 183 | dependencies: 184 | "@types/connect" "*" 185 | "@types/node" "*" 186 | 187 | "@types/connect@*": 188 | version "3.4.32" 189 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 190 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 191 | dependencies: 192 | "@types/node" "*" 193 | 194 | "@types/express-serve-static-core@*": 195 | version "4.16.9" 196 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.9.tgz#69e00643b0819b024bdede95ced3ff239bb54558" 197 | integrity sha512-GqpaVWR0DM8FnRUJYKlWgyARoBUAVfRIeVDZQKOttLFp5SmhhF9YFIYeTPwMd/AXfxlP7xVO2dj1fGu0Q+krKQ== 198 | dependencies: 199 | "@types/node" "*" 200 | "@types/range-parser" "*" 201 | 202 | "@types/express@^4.17.0": 203 | version "4.17.1" 204 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.1.tgz#4cf7849ae3b47125a567dfee18bfca4254b88c5c" 205 | integrity sha512-VfH/XCP0QbQk5B5puLqTLEeFgR8lfCJHZJKkInZ9mkYd+u8byX0kztXEQxEk4wZXJs8HI+7km2ALXjn4YKcX9w== 206 | dependencies: 207 | "@types/body-parser" "*" 208 | "@types/express-serve-static-core" "*" 209 | "@types/serve-static" "*" 210 | 211 | "@types/lodash@^4.14.104": 212 | version "4.14.138" 213 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.138.tgz#34f52640d7358230308344e579c15b378d91989e" 214 | integrity sha512-A4uJgHz4hakwNBdHNPdxOTkYmXNgmUAKLbXZ7PKGslgeV0Mb8P3BlbYfPovExek1qnod4pDfRbxuzcVs3dlFLg== 215 | 216 | "@types/long@^4.0.0": 217 | version "4.0.0" 218 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" 219 | integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== 220 | 221 | "@types/mime@*": 222 | version "2.0.1" 223 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 224 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 225 | 226 | "@types/node@*": 227 | version "12.7.5" 228 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" 229 | integrity sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w== 230 | 231 | "@types/node@^10.1.0": 232 | version "10.14.18" 233 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.18.tgz#b7d45fc950e6ffd7edc685e890d13aa7b8535dce" 234 | integrity sha512-ryO3Q3++yZC/+b8j8BdKd/dn9JlzlHBPdm80656xwYUdmPkpTGTjkAdt6BByiNupGPE8w0FhBgvYy/fX9hRNGQ== 235 | 236 | "@types/node@^8.0.53": 237 | version "8.10.54" 238 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.54.tgz#1c88eb253ac1210f1a5876953fb70f7cc4928402" 239 | integrity sha512-kaYyLYf6ICn6/isAyD4K1MyWWd5Q3JgH6bnMN089LUx88+s4W8GvK9Q6JMBVu5vsFFp7pMdSxdKmlBXwH/VFRg== 240 | 241 | "@types/range-parser@*": 242 | version "1.2.3" 243 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 244 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 245 | 246 | "@types/serve-static@*": 247 | version "1.13.3" 248 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1" 249 | integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== 250 | dependencies: 251 | "@types/express-serve-static-core" "*" 252 | "@types/mime" "*" 253 | 254 | abort-controller@^3.0.0: 255 | version "3.0.0" 256 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 257 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 258 | dependencies: 259 | event-target-shim "^5.0.0" 260 | 261 | accepts@~1.3.7: 262 | version "1.3.7" 263 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 264 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 265 | dependencies: 266 | mime-types "~2.1.24" 267 | negotiator "0.6.2" 268 | 269 | agent-base@4, agent-base@^4.3.0: 270 | version "4.3.0" 271 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" 272 | integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== 273 | dependencies: 274 | es6-promisify "^5.0.0" 275 | 276 | array-flatten@1.1.1: 277 | version "1.1.1" 278 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 279 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 280 | 281 | arrify@^2.0.0: 282 | version "2.0.1" 283 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 284 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 285 | 286 | base64-js@^1.3.0: 287 | version "1.3.1" 288 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 289 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 290 | 291 | basic-auth@~2.0.0: 292 | version "2.0.1" 293 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 294 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 295 | dependencies: 296 | safe-buffer "5.1.2" 297 | 298 | bignumber.js@^7.0.0: 299 | version "7.2.1" 300 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" 301 | integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== 302 | 303 | body-parser@1.19.0, body-parser@^1.19.0: 304 | version "1.19.0" 305 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 306 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 307 | dependencies: 308 | bytes "3.1.0" 309 | content-type "~1.0.4" 310 | debug "2.6.9" 311 | depd "~1.1.2" 312 | http-errors "1.7.2" 313 | iconv-lite "0.4.24" 314 | on-finished "~2.3.0" 315 | qs "6.7.0" 316 | raw-body "2.4.0" 317 | type-is "~1.6.17" 318 | 319 | buffer-equal-constant-time@1.0.1: 320 | version "1.0.1" 321 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 322 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 323 | 324 | buffer-from@^1.0.0: 325 | version "1.1.1" 326 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 327 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 328 | 329 | bun@^0.0.12: 330 | version "0.0.12" 331 | resolved "https://registry.yarnpkg.com/bun/-/bun-0.0.12.tgz#d54fae69f895557f275423bc14b404030b20a5fc" 332 | integrity sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ== 333 | dependencies: 334 | readable-stream "~1.0.32" 335 | 336 | bytes@3.1.0: 337 | version "3.1.0" 338 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 339 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 340 | 341 | compressible@^2.0.12: 342 | version "2.0.17" 343 | resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" 344 | integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== 345 | dependencies: 346 | mime-db ">= 1.40.0 < 2" 347 | 348 | concat-stream@^2.0.0: 349 | version "2.0.0" 350 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" 351 | integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== 352 | dependencies: 353 | buffer-from "^1.0.0" 354 | inherits "^2.0.3" 355 | readable-stream "^3.0.2" 356 | typedarray "^0.0.6" 357 | 358 | configstore@^5.0.0: 359 | version "5.0.0" 360 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.0.tgz#37de662c7a49b5fe8dbcf8f6f5818d2d81ed852b" 361 | integrity sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ== 362 | dependencies: 363 | dot-prop "^5.1.0" 364 | graceful-fs "^4.1.2" 365 | make-dir "^3.0.0" 366 | unique-string "^2.0.0" 367 | write-file-atomic "^3.0.0" 368 | xdg-basedir "^4.0.0" 369 | 370 | content-disposition@0.5.3: 371 | version "0.5.3" 372 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 373 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 374 | dependencies: 375 | safe-buffer "5.1.2" 376 | 377 | content-type@~1.0.4: 378 | version "1.0.4" 379 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 380 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 381 | 382 | cookie-signature@1.0.6: 383 | version "1.0.6" 384 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 385 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 386 | 387 | cookie@0.4.0: 388 | version "0.4.0" 389 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 390 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 391 | 392 | core-util-is@~1.0.0: 393 | version "1.0.2" 394 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 395 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 396 | 397 | cors@^2.8.5: 398 | version "2.8.5" 399 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 400 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 401 | dependencies: 402 | object-assign "^4" 403 | vary "^1" 404 | 405 | crypto-random-string@^2.0.0: 406 | version "2.0.0" 407 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 408 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 409 | 410 | date-and-time@^0.9.0: 411 | version "0.9.0" 412 | resolved "https://registry.yarnpkg.com/date-and-time/-/date-and-time-0.9.0.tgz#1524579e56dc07675c640b41735a7665c0659240" 413 | integrity sha512-4JybB6PbR+EebpFx/KyR5Ybl+TcdXMLIJkyYsCx3P4M4CWGMuDyFF19yh6TyasMAIF5lrsgIxiSHBXh2FFc7Fg== 414 | 415 | debug@2.6.9: 416 | version "2.6.9" 417 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 418 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 419 | dependencies: 420 | ms "2.0.0" 421 | 422 | debug@3.1.0: 423 | version "3.1.0" 424 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 425 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 426 | dependencies: 427 | ms "2.0.0" 428 | 429 | debug@^3.1.0: 430 | version "3.2.6" 431 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 432 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 433 | dependencies: 434 | ms "^2.1.1" 435 | 436 | debug@^4.1.1: 437 | version "4.1.1" 438 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 439 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 440 | dependencies: 441 | ms "^2.1.1" 442 | 443 | deep-equal@^1.0.1: 444 | version "1.1.0" 445 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" 446 | integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw== 447 | dependencies: 448 | is-arguments "^1.0.4" 449 | is-date-object "^1.0.1" 450 | is-regex "^1.0.4" 451 | object-is "^1.0.1" 452 | object-keys "^1.1.1" 453 | regexp.prototype.flags "^1.2.0" 454 | 455 | define-properties@^1.1.2: 456 | version "1.1.3" 457 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 458 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 459 | dependencies: 460 | object-keys "^1.0.12" 461 | 462 | depd@~1.1.2: 463 | version "1.1.2" 464 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 465 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 466 | 467 | destroy@~1.0.4: 468 | version "1.0.4" 469 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 470 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 471 | 472 | dicer@^0.3.0: 473 | version "0.3.0" 474 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" 475 | integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== 476 | dependencies: 477 | streamsearch "0.1.2" 478 | 479 | dot-prop@^5.1.0: 480 | version "5.2.0" 481 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" 482 | integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== 483 | dependencies: 484 | is-obj "^2.0.0" 485 | 486 | duplexify@^3.5.0, duplexify@^3.6.0: 487 | version "3.7.1" 488 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" 489 | integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== 490 | dependencies: 491 | end-of-stream "^1.0.0" 492 | inherits "^2.0.1" 493 | readable-stream "^2.0.0" 494 | stream-shift "^1.0.0" 495 | 496 | duplexify@^4.1.1: 497 | version "4.1.1" 498 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61" 499 | integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA== 500 | dependencies: 501 | end-of-stream "^1.4.1" 502 | inherits "^2.0.3" 503 | readable-stream "^3.1.1" 504 | stream-shift "^1.0.0" 505 | 506 | ecdsa-sig-formatter@1.0.11: 507 | version "1.0.11" 508 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 509 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 510 | dependencies: 511 | safe-buffer "^5.0.1" 512 | 513 | ee-first@1.1.1: 514 | version "1.1.1" 515 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 516 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 517 | 518 | encodeurl@~1.0.2: 519 | version "1.0.2" 520 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 521 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 522 | 523 | end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: 524 | version "1.4.1" 525 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 526 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 527 | dependencies: 528 | once "^1.4.0" 529 | 530 | ent@^2.2.0: 531 | version "2.2.0" 532 | resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" 533 | integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= 534 | 535 | es6-promise@^4.0.3: 536 | version "4.2.8" 537 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 538 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 539 | 540 | es6-promisify@^5.0.0: 541 | version "5.0.0" 542 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 543 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 544 | dependencies: 545 | es6-promise "^4.0.3" 546 | 547 | escape-html@~1.0.3: 548 | version "1.0.3" 549 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 550 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 551 | 552 | etag@~1.8.1: 553 | version "1.8.1" 554 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 555 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 556 | 557 | event-target-shim@^5.0.0: 558 | version "5.0.1" 559 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 560 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 561 | 562 | express@^4.17.1: 563 | version "4.17.1" 564 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 565 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 566 | dependencies: 567 | accepts "~1.3.7" 568 | array-flatten "1.1.1" 569 | body-parser "1.19.0" 570 | content-disposition "0.5.3" 571 | content-type "~1.0.4" 572 | cookie "0.4.0" 573 | cookie-signature "1.0.6" 574 | debug "2.6.9" 575 | depd "~1.1.2" 576 | encodeurl "~1.0.2" 577 | escape-html "~1.0.3" 578 | etag "~1.8.1" 579 | finalhandler "~1.1.2" 580 | fresh "0.5.2" 581 | merge-descriptors "1.0.1" 582 | methods "~1.1.2" 583 | on-finished "~2.3.0" 584 | parseurl "~1.3.3" 585 | path-to-regexp "0.1.7" 586 | proxy-addr "~2.0.5" 587 | qs "6.7.0" 588 | range-parser "~1.2.1" 589 | safe-buffer "5.1.2" 590 | send "0.17.1" 591 | serve-static "1.14.1" 592 | setprototypeof "1.1.1" 593 | statuses "~1.5.0" 594 | type-is "~1.6.18" 595 | utils-merge "1.0.1" 596 | vary "~1.1.2" 597 | 598 | extend@^3.0.2: 599 | version "3.0.2" 600 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 601 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 602 | 603 | fast-text-encoding@^1.0.0: 604 | version "1.0.0" 605 | resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef" 606 | integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ== 607 | 608 | faye-websocket@0.11.3: 609 | version "0.11.3" 610 | resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" 611 | integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== 612 | dependencies: 613 | websocket-driver ">=0.5.1" 614 | 615 | finalhandler@~1.1.2: 616 | version "1.1.2" 617 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 618 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 619 | dependencies: 620 | debug "2.6.9" 621 | encodeurl "~1.0.2" 622 | escape-html "~1.0.3" 623 | on-finished "~2.3.0" 624 | parseurl "~1.3.3" 625 | statuses "~1.5.0" 626 | unpipe "~1.0.0" 627 | 628 | firebase-admin@^8.0.0: 629 | version "8.5.0" 630 | resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-8.5.0.tgz#99d1a007edb1689c3012eca64968c93846d5e292" 631 | integrity sha512-rvgCj5Z1iFOT6K6uW37VRl4PKNpAcBFu/FIQ4Nl5bFnqbHSxf+QxzsqdsUtIxdqZU1yh2DTs2t+s5qORx/T9+g== 632 | dependencies: 633 | "@firebase/database" "^0.5.1" 634 | "@types/node" "^8.0.53" 635 | dicer "^0.3.0" 636 | jsonwebtoken "8.1.0" 637 | node-forge "0.7.4" 638 | optionalDependencies: 639 | "@google-cloud/firestore" "^2.0.0" 640 | "@google-cloud/storage" "^3.0.2" 641 | 642 | firebase-functions-test@^0.1.6: 643 | version "0.1.6" 644 | resolved "https://registry.yarnpkg.com/firebase-functions-test/-/firebase-functions-test-0.1.6.tgz#4c880e927c87fad32d5c6377e17b2cab9eda10bf" 645 | integrity sha512-sITLbQunI75gL690qFOq4mqxUEcdETEbY4HcLFawWVJC3PmlSFt81mhfZjJe45GJTt1+7xeowaHQx3jpnoPNpA== 646 | dependencies: 647 | "@types/lodash" "^4.14.104" 648 | lodash "^4.17.5" 649 | 650 | firebase-functions@^3.1.0: 651 | version "3.2.0" 652 | resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-3.2.0.tgz#c4c01ea2f97aafb7aa45776eaff52a0f7f44678e" 653 | integrity sha512-v61CXYFSb53SdSSqwc/QhdBrR+H0bhwxSOIhKIYFFa2m5APUsuj8SrkAOBL2CfOJo3yk7+nuuWOtz16JFaXLxg== 654 | dependencies: 655 | "@types/express" "^4.17.0" 656 | cors "^2.8.5" 657 | express "^4.17.1" 658 | jsonwebtoken "^8.5.1" 659 | lodash "^4.17.14" 660 | 661 | forwarded@~0.1.2: 662 | version "0.1.2" 663 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 664 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 665 | 666 | fresh@0.5.2: 667 | version "0.5.2" 668 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 669 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 670 | 671 | function-bind@^1.1.1: 672 | version "1.1.1" 673 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 674 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 675 | 676 | functional-red-black-tree@^1.0.1: 677 | version "1.0.1" 678 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 679 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 680 | 681 | gaxios@^2.0.0, gaxios@^2.0.1: 682 | version "2.0.1" 683 | resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-2.0.1.tgz#2ca1c9eb64c525d852048721316c138dddf40708" 684 | integrity sha512-c1NXovTxkgRJTIgB2FrFmOFg4YIV6N/bAa4f/FZ4jIw13Ql9ya/82x69CswvotJhbV3DiGnlTZwoq2NVXk2Irg== 685 | dependencies: 686 | abort-controller "^3.0.0" 687 | extend "^3.0.2" 688 | https-proxy-agent "^2.2.1" 689 | node-fetch "^2.3.0" 690 | 691 | gcp-metadata@^2.0.0: 692 | version "2.0.2" 693 | resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-2.0.2.tgz#6b391c531cdd0c1d1ebde35050fdaaf5462aa544" 694 | integrity sha512-dxPXBvjyfz5qFEBXzEwNmuZXwsGYfuASGYeg3CKZDaQRXdiWti9J3/Ezmtyon1OrCNpDO2YekyoSjEqMtsrcXw== 695 | dependencies: 696 | gaxios "^2.0.1" 697 | json-bigint "^0.3.0" 698 | 699 | gcs-resumable-upload@^2.0.0: 700 | version "2.2.5" 701 | resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-2.2.5.tgz#13e832130eb8c12be6d80f4bdc6fc0c410f73ad1" 702 | integrity sha512-r98Hnxza8oYT21MzpziAB2thz3AURGz54+osWtczxGNxH7Fodb0HVUEtfqTwBS5vcf9RnKwR7c0EMaI8R39feg== 703 | dependencies: 704 | abort-controller "^3.0.0" 705 | configstore "^5.0.0" 706 | gaxios "^2.0.0" 707 | google-auth-library "^5.0.0" 708 | pumpify "^2.0.0" 709 | stream-events "^1.0.4" 710 | 711 | google-auth-library@^5.0.0: 712 | version "5.2.1" 713 | resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-5.2.1.tgz#3df7cb4186a24355184551837b24012cb1b31013" 714 | integrity sha512-p9vO6UcRIK/zD3PxoMijaUfFYu6tvzaQwvag1K/82O42NBeAnmllyQUgqaBhcAh9FzFAVlN4bQIaO8+prpE7Vg== 715 | dependencies: 716 | arrify "^2.0.0" 717 | base64-js "^1.3.0" 718 | fast-text-encoding "^1.0.0" 719 | gaxios "^2.0.0" 720 | gcp-metadata "^2.0.0" 721 | gtoken "^4.0.0" 722 | jws "^3.1.5" 723 | lru-cache "^5.0.0" 724 | 725 | google-gax@^1.1.2: 726 | version "1.5.2" 727 | resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-1.5.2.tgz#996cf70778667cc22befbeae4b8a9d76fce0fabb" 728 | integrity sha512-NceyDzlw4mQz6qH3bDIuRtfDAZKehM96QpnPPJ3Hur7FA/gPzpzboUYwhfP6q5obSP4LuSSDhI/76Fu51/ljtg== 729 | dependencies: 730 | "@grpc/grpc-js" "^0.5.2" 731 | "@grpc/proto-loader" "^0.5.1" 732 | abort-controller "^3.0.0" 733 | duplexify "^3.6.0" 734 | google-auth-library "^5.0.0" 735 | is-stream-ended "^0.1.4" 736 | lodash.at "^4.6.0" 737 | lodash.has "^4.5.2" 738 | node-fetch "^2.6.0" 739 | protobufjs "^6.8.8" 740 | retry-request "^4.0.0" 741 | semver "^6.0.0" 742 | walkdir "^0.4.0" 743 | 744 | google-p12-pem@^2.0.0: 745 | version "2.0.2" 746 | resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-2.0.2.tgz#39cae8f6fcbe66a01f00be4ddf2d56b95926fa7b" 747 | integrity sha512-UfnEARfJKI6pbmC1hfFFm+UAcZxeIwTiEcHfqKe/drMsXD/ilnVjF7zgOGpHXyhuvX6jNJK3S8A0hOQjwtFxEw== 748 | dependencies: 749 | node-forge "^0.9.0" 750 | 751 | graceful-fs@^4.1.2: 752 | version "4.2.2" 753 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" 754 | integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== 755 | 756 | gtoken@^4.0.0: 757 | version "4.0.0" 758 | resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-4.0.0.tgz#42b63a935a03a61eedf0ec14f74f6875bad627bd" 759 | integrity sha512-XaRCfHJxhj06LmnWNBzVTAr85NfAErq0W1oabkdqwbq3uL/QTB1kyvGog361Uu2FMG/8e3115sIy/97Rnd4GjQ== 760 | dependencies: 761 | gaxios "^2.0.0" 762 | google-p12-pem "^2.0.0" 763 | jws "^3.1.5" 764 | mime "^2.2.0" 765 | 766 | has@^1.0.1: 767 | version "1.0.3" 768 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 769 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 770 | dependencies: 771 | function-bind "^1.1.1" 772 | 773 | hash-stream-validation@^0.2.1: 774 | version "0.2.1" 775 | resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz#ecc9b997b218be5bb31298628bb807869b73dcd1" 776 | integrity sha1-7Mm5l7IYvluzEphii7gHhptz3NE= 777 | dependencies: 778 | through2 "^2.0.0" 779 | 780 | http-errors@1.7.2: 781 | version "1.7.2" 782 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 783 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 784 | dependencies: 785 | depd "~1.1.2" 786 | inherits "2.0.3" 787 | setprototypeof "1.1.1" 788 | statuses ">= 1.5.0 < 2" 789 | toidentifier "1.0.0" 790 | 791 | http-errors@~1.7.2: 792 | version "1.7.3" 793 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 794 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 795 | dependencies: 796 | depd "~1.1.2" 797 | inherits "2.0.4" 798 | setprototypeof "1.1.1" 799 | statuses ">= 1.5.0 < 2" 800 | toidentifier "1.0.0" 801 | 802 | "http-parser-js@>=0.4.0 <0.4.11": 803 | version "0.4.10" 804 | resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" 805 | integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= 806 | 807 | http-proxy-agent@^2.1.0: 808 | version "2.1.0" 809 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" 810 | integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== 811 | dependencies: 812 | agent-base "4" 813 | debug "3.1.0" 814 | 815 | https-proxy-agent@^2.2.1: 816 | version "2.2.4" 817 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" 818 | integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== 819 | dependencies: 820 | agent-base "^4.3.0" 821 | debug "^3.1.0" 822 | 823 | iconv-lite@0.4.24: 824 | version "0.4.24" 825 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 826 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 827 | dependencies: 828 | safer-buffer ">= 2.1.2 < 3" 829 | 830 | imurmurhash@^0.1.4: 831 | version "0.1.4" 832 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 833 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 834 | 835 | inherits@2.0.3: 836 | version "2.0.3" 837 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 838 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 839 | 840 | inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 841 | version "2.0.4" 842 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 843 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 844 | 845 | ipaddr.js@1.9.0: 846 | version "1.9.0" 847 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" 848 | integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 849 | 850 | is-arguments@^1.0.4: 851 | version "1.0.4" 852 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" 853 | integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== 854 | 855 | is-date-object@^1.0.1: 856 | version "1.0.1" 857 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 858 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 859 | 860 | is-obj@^2.0.0: 861 | version "2.0.0" 862 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 863 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 864 | 865 | is-regex@^1.0.4: 866 | version "1.0.4" 867 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 868 | integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 869 | dependencies: 870 | has "^1.0.1" 871 | 872 | is-stream-ended@^0.1.4: 873 | version "0.1.4" 874 | resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.4.tgz#f50224e95e06bce0e356d440a4827cd35b267eda" 875 | integrity sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw== 876 | 877 | is-typedarray@^1.0.0: 878 | version "1.0.0" 879 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 880 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 881 | 882 | isarray@0.0.1: 883 | version "0.0.1" 884 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 885 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 886 | 887 | isarray@~1.0.0: 888 | version "1.0.0" 889 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 890 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 891 | 892 | json-bigint@^0.3.0: 893 | version "0.3.0" 894 | resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-0.3.0.tgz#0ccd912c4b8270d05f056fbd13814b53d3825b1e" 895 | integrity sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4= 896 | dependencies: 897 | bignumber.js "^7.0.0" 898 | 899 | jsonwebtoken@8.1.0: 900 | version "8.1.0" 901 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz#c6397cd2e5fd583d65c007a83dc7bb78e6982b83" 902 | integrity sha1-xjl80uX9WD1lwAeoPce7eOaYK4M= 903 | dependencies: 904 | jws "^3.1.4" 905 | lodash.includes "^4.3.0" 906 | lodash.isboolean "^3.0.3" 907 | lodash.isinteger "^4.0.4" 908 | lodash.isnumber "^3.0.3" 909 | lodash.isplainobject "^4.0.6" 910 | lodash.isstring "^4.0.1" 911 | lodash.once "^4.0.0" 912 | ms "^2.0.0" 913 | xtend "^4.0.1" 914 | 915 | jsonwebtoken@^8.5.1: 916 | version "8.5.1" 917 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 918 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 919 | dependencies: 920 | jws "^3.2.2" 921 | lodash.includes "^4.3.0" 922 | lodash.isboolean "^3.0.3" 923 | lodash.isinteger "^4.0.4" 924 | lodash.isnumber "^3.0.3" 925 | lodash.isplainobject "^4.0.6" 926 | lodash.isstring "^4.0.1" 927 | lodash.once "^4.0.0" 928 | ms "^2.1.1" 929 | semver "^5.6.0" 930 | 931 | jwa@^1.4.1: 932 | version "1.4.1" 933 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 934 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 935 | dependencies: 936 | buffer-equal-constant-time "1.0.1" 937 | ecdsa-sig-formatter "1.0.11" 938 | safe-buffer "^5.0.1" 939 | 940 | jws@^3.1.4, jws@^3.1.5, jws@^3.2.2: 941 | version "3.2.2" 942 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 943 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 944 | dependencies: 945 | jwa "^1.4.1" 946 | safe-buffer "^5.0.1" 947 | 948 | lodash.at@^4.6.0: 949 | version "4.6.0" 950 | resolved "https://registry.yarnpkg.com/lodash.at/-/lodash.at-4.6.0.tgz#93cdce664f0a1994ea33dd7cd40e23afd11b0ff8" 951 | integrity sha1-k83OZk8KGZTqM9181A4jr9EbD/g= 952 | 953 | lodash.camelcase@^4.3.0: 954 | version "4.3.0" 955 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 956 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 957 | 958 | lodash.has@^4.5.2: 959 | version "4.5.2" 960 | resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" 961 | integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= 962 | 963 | lodash.includes@^4.3.0: 964 | version "4.3.0" 965 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 966 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 967 | 968 | lodash.isboolean@^3.0.3: 969 | version "3.0.3" 970 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 971 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 972 | 973 | lodash.isinteger@^4.0.4: 974 | version "4.0.4" 975 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 976 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 977 | 978 | lodash.isnumber@^3.0.3: 979 | version "3.0.3" 980 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 981 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 982 | 983 | lodash.isplainobject@^4.0.6: 984 | version "4.0.6" 985 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 986 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 987 | 988 | lodash.isstring@^4.0.1: 989 | version "4.0.1" 990 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 991 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 992 | 993 | lodash.once@^4.0.0: 994 | version "4.1.1" 995 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 996 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 997 | 998 | lodash@^4.17.14, lodash@^4.17.5: 999 | version "4.17.15" 1000 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1001 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1002 | 1003 | long@^4.0.0: 1004 | version "4.0.0" 1005 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1006 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1007 | 1008 | lru-cache@^5.0.0: 1009 | version "5.1.1" 1010 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1011 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1012 | dependencies: 1013 | yallist "^3.0.2" 1014 | 1015 | make-dir@^3.0.0: 1016 | version "3.0.0" 1017 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" 1018 | integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== 1019 | dependencies: 1020 | semver "^6.0.0" 1021 | 1022 | media-typer@0.3.0: 1023 | version "0.3.0" 1024 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1025 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1026 | 1027 | merge-descriptors@1.0.1: 1028 | version "1.0.1" 1029 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1030 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1031 | 1032 | methods@~1.1.2: 1033 | version "1.1.2" 1034 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1035 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1036 | 1037 | mime-db@1.40.0: 1038 | version "1.40.0" 1039 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" 1040 | integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== 1041 | 1042 | "mime-db@>= 1.40.0 < 2": 1043 | version "1.41.0" 1044 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0" 1045 | integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw== 1046 | 1047 | mime-types@^2.0.8, mime-types@~2.1.24: 1048 | version "2.1.24" 1049 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" 1050 | integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== 1051 | dependencies: 1052 | mime-db "1.40.0" 1053 | 1054 | mime@1.6.0: 1055 | version "1.6.0" 1056 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1057 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1058 | 1059 | mime@^2.2.0: 1060 | version "2.4.4" 1061 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 1062 | integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== 1063 | 1064 | mimic-fn@^2.1.0: 1065 | version "2.1.0" 1066 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1067 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1068 | 1069 | moment@^2.24.0: 1070 | version "2.24.0" 1071 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" 1072 | integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 1073 | 1074 | morgan@^1.9.1: 1075 | version "1.9.1" 1076 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" 1077 | integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== 1078 | dependencies: 1079 | basic-auth "~2.0.0" 1080 | debug "2.6.9" 1081 | depd "~1.1.2" 1082 | on-finished "~2.3.0" 1083 | on-headers "~1.0.1" 1084 | 1085 | ms@2.0.0: 1086 | version "2.0.0" 1087 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1088 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1089 | 1090 | ms@2.1.1: 1091 | version "2.1.1" 1092 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1093 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1094 | 1095 | ms@^2.0.0, ms@^2.1.1: 1096 | version "2.1.2" 1097 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1098 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1099 | 1100 | negotiator@0.6.2: 1101 | version "0.6.2" 1102 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1103 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1104 | 1105 | node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.6.0: 1106 | version "2.6.0" 1107 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" 1108 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1109 | 1110 | node-forge@0.7.4: 1111 | version "0.7.4" 1112 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.4.tgz#8e6e9f563a1e32213aa7508cded22aa791dbf986" 1113 | integrity sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA== 1114 | 1115 | node-forge@^0.9.0: 1116 | version "0.9.0" 1117 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" 1118 | integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== 1119 | 1120 | object-assign@^4: 1121 | version "4.1.1" 1122 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1123 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1124 | 1125 | object-is@^1.0.1: 1126 | version "1.0.1" 1127 | resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" 1128 | integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= 1129 | 1130 | object-keys@^1.0.12, object-keys@^1.1.1: 1131 | version "1.1.1" 1132 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1133 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1134 | 1135 | on-finished@~2.3.0: 1136 | version "2.3.0" 1137 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1138 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1139 | dependencies: 1140 | ee-first "1.1.1" 1141 | 1142 | on-headers@~1.0.1: 1143 | version "1.0.2" 1144 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1145 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1146 | 1147 | once@^1.3.1, once@^1.4.0: 1148 | version "1.4.0" 1149 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1150 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1151 | dependencies: 1152 | wrappy "1" 1153 | 1154 | onetime@^5.1.0: 1155 | version "5.1.0" 1156 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1157 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1158 | dependencies: 1159 | mimic-fn "^2.1.0" 1160 | 1161 | p-limit@^2.2.0: 1162 | version "2.2.1" 1163 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" 1164 | integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== 1165 | dependencies: 1166 | p-try "^2.0.0" 1167 | 1168 | p-try@^2.0.0: 1169 | version "2.2.0" 1170 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1171 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1172 | 1173 | parseurl@~1.3.3: 1174 | version "1.3.3" 1175 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1176 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1177 | 1178 | path-to-regexp@0.1.7: 1179 | version "0.1.7" 1180 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1181 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1182 | 1183 | process-nextick-args@~2.0.0: 1184 | version "2.0.1" 1185 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1186 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1187 | 1188 | protobufjs@^6.8.6, protobufjs@^6.8.8: 1189 | version "6.8.8" 1190 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" 1191 | integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== 1192 | dependencies: 1193 | "@protobufjs/aspromise" "^1.1.2" 1194 | "@protobufjs/base64" "^1.1.2" 1195 | "@protobufjs/codegen" "^2.0.4" 1196 | "@protobufjs/eventemitter" "^1.1.0" 1197 | "@protobufjs/fetch" "^1.1.0" 1198 | "@protobufjs/float" "^1.0.2" 1199 | "@protobufjs/inquire" "^1.1.0" 1200 | "@protobufjs/path" "^1.1.2" 1201 | "@protobufjs/pool" "^1.1.0" 1202 | "@protobufjs/utf8" "^1.1.0" 1203 | "@types/long" "^4.0.0" 1204 | "@types/node" "^10.1.0" 1205 | long "^4.0.0" 1206 | 1207 | proxy-addr@~2.0.5: 1208 | version "2.0.5" 1209 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" 1210 | integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 1211 | dependencies: 1212 | forwarded "~0.1.2" 1213 | ipaddr.js "1.9.0" 1214 | 1215 | pump@^3.0.0: 1216 | version "3.0.0" 1217 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1218 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1219 | dependencies: 1220 | end-of-stream "^1.1.0" 1221 | once "^1.3.1" 1222 | 1223 | pumpify@^2.0.0: 1224 | version "2.0.0" 1225 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-2.0.0.tgz#975519e5a9890ae0fb4724274e3fec97e43a30b6" 1226 | integrity sha512-ieN9HmpFPt4J4U4qnjN4BxrnqpPPXJyp3qFErxfwBtFOec6ewpIHdS2eu3TkmGW6S+RzFGEOGpm5ih/X/onRPQ== 1227 | dependencies: 1228 | duplexify "^4.1.1" 1229 | inherits "^2.0.3" 1230 | pump "^3.0.0" 1231 | 1232 | qs@6.7.0: 1233 | version "6.7.0" 1234 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1235 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1236 | 1237 | range-parser@~1.2.1: 1238 | version "1.2.1" 1239 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1240 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1241 | 1242 | raw-body@2.4.0: 1243 | version "2.4.0" 1244 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1245 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1246 | dependencies: 1247 | bytes "3.1.0" 1248 | http-errors "1.7.2" 1249 | iconv-lite "0.4.24" 1250 | unpipe "1.0.0" 1251 | 1252 | "readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1: 1253 | version "3.4.0" 1254 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" 1255 | integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== 1256 | dependencies: 1257 | inherits "^2.0.3" 1258 | string_decoder "^1.1.1" 1259 | util-deprecate "^1.0.1" 1260 | 1261 | readable-stream@^2.0.0, readable-stream@~2.3.6: 1262 | version "2.3.6" 1263 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1264 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1265 | dependencies: 1266 | core-util-is "~1.0.0" 1267 | inherits "~2.0.3" 1268 | isarray "~1.0.0" 1269 | process-nextick-args "~2.0.0" 1270 | safe-buffer "~5.1.1" 1271 | string_decoder "~1.1.1" 1272 | util-deprecate "~1.0.1" 1273 | 1274 | readable-stream@~1.0.32: 1275 | version "1.0.34" 1276 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 1277 | integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= 1278 | dependencies: 1279 | core-util-is "~1.0.0" 1280 | inherits "~2.0.1" 1281 | isarray "0.0.1" 1282 | string_decoder "~0.10.x" 1283 | 1284 | regexp.prototype.flags@^1.2.0: 1285 | version "1.2.0" 1286 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" 1287 | integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== 1288 | dependencies: 1289 | define-properties "^1.1.2" 1290 | 1291 | retry-request@^4.0.0: 1292 | version "4.1.1" 1293 | resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-4.1.1.tgz#f676d0db0de7a6f122c048626ce7ce12101d2bd8" 1294 | integrity sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ== 1295 | dependencies: 1296 | debug "^4.1.1" 1297 | through2 "^3.0.1" 1298 | 1299 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1300 | version "5.1.2" 1301 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1302 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1303 | 1304 | safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@~5.2.0: 1305 | version "5.2.0" 1306 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1307 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1308 | 1309 | "safer-buffer@>= 2.1.2 < 3": 1310 | version "2.1.2" 1311 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1312 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1313 | 1314 | semver@^5.6.0: 1315 | version "5.7.1" 1316 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1317 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1318 | 1319 | semver@^6.0.0, semver@^6.2.0: 1320 | version "6.3.0" 1321 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1322 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1323 | 1324 | send@0.17.1: 1325 | version "0.17.1" 1326 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1327 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1328 | dependencies: 1329 | debug "2.6.9" 1330 | depd "~1.1.2" 1331 | destroy "~1.0.4" 1332 | encodeurl "~1.0.2" 1333 | escape-html "~1.0.3" 1334 | etag "~1.8.1" 1335 | fresh "0.5.2" 1336 | http-errors "~1.7.2" 1337 | mime "1.6.0" 1338 | ms "2.1.1" 1339 | on-finished "~2.3.0" 1340 | range-parser "~1.2.1" 1341 | statuses "~1.5.0" 1342 | 1343 | serve-static@1.14.1: 1344 | version "1.14.1" 1345 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1346 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1347 | dependencies: 1348 | encodeurl "~1.0.2" 1349 | escape-html "~1.0.3" 1350 | parseurl "~1.3.3" 1351 | send "0.17.1" 1352 | 1353 | setprototypeof@1.1.1: 1354 | version "1.1.1" 1355 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1356 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1357 | 1358 | signal-exit@^3.0.2: 1359 | version "3.0.2" 1360 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1361 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1362 | 1363 | snakeize@^0.1.0: 1364 | version "0.1.0" 1365 | resolved "https://registry.yarnpkg.com/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d" 1366 | integrity sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0= 1367 | 1368 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1369 | version "1.5.0" 1370 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1371 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1372 | 1373 | stream-events@^1.0.1, stream-events@^1.0.4, stream-events@^1.0.5: 1374 | version "1.0.5" 1375 | resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.5.tgz#bbc898ec4df33a4902d892333d47da9bf1c406d5" 1376 | integrity sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== 1377 | dependencies: 1378 | stubs "^3.0.0" 1379 | 1380 | stream-shift@^1.0.0: 1381 | version "1.0.0" 1382 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 1383 | integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= 1384 | 1385 | streamsearch@0.1.2: 1386 | version "0.1.2" 1387 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 1388 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 1389 | 1390 | string_decoder@^1.1.1: 1391 | version "1.3.0" 1392 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1393 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1394 | dependencies: 1395 | safe-buffer "~5.2.0" 1396 | 1397 | string_decoder@~0.10.x: 1398 | version "0.10.31" 1399 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1400 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 1401 | 1402 | string_decoder@~1.1.1: 1403 | version "1.1.1" 1404 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1405 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1406 | dependencies: 1407 | safe-buffer "~5.1.0" 1408 | 1409 | stubs@^3.0.0: 1410 | version "3.0.0" 1411 | resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" 1412 | integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= 1413 | 1414 | teeny-request@^5.2.1: 1415 | version "5.2.1" 1416 | resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-5.2.1.tgz#a6394db8359b87e64e47eeb2fbf34a65c9a751ff" 1417 | integrity sha512-gCVm5EV3z0p/yZOKyeBOFOpSXuxdIs3foeWDWb/foKMBejK18w40L0k0UMd/ZrGkOH+gxodjqpL8KK6x3haYCQ== 1418 | dependencies: 1419 | http-proxy-agent "^2.1.0" 1420 | https-proxy-agent "^2.2.1" 1421 | node-fetch "^2.2.0" 1422 | stream-events "^1.0.5" 1423 | uuid "^3.3.2" 1424 | 1425 | through2@^2.0.0: 1426 | version "2.0.5" 1427 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 1428 | integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== 1429 | dependencies: 1430 | readable-stream "~2.3.6" 1431 | xtend "~4.0.1" 1432 | 1433 | through2@^3.0.0, through2@^3.0.1: 1434 | version "3.0.1" 1435 | resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" 1436 | integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== 1437 | dependencies: 1438 | readable-stream "2 || 3" 1439 | 1440 | toidentifier@1.0.0: 1441 | version "1.0.0" 1442 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1443 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1444 | 1445 | tslib@1.10.0: 1446 | version "1.10.0" 1447 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1448 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1449 | 1450 | type-is@~1.6.17, type-is@~1.6.18: 1451 | version "1.6.18" 1452 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1453 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1454 | dependencies: 1455 | media-typer "0.3.0" 1456 | mime-types "~2.1.24" 1457 | 1458 | typedarray-to-buffer@^3.1.5: 1459 | version "3.1.5" 1460 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1461 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1462 | dependencies: 1463 | is-typedarray "^1.0.0" 1464 | 1465 | typedarray@^0.0.6: 1466 | version "0.0.6" 1467 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1468 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 1469 | 1470 | unique-string@^2.0.0: 1471 | version "2.0.0" 1472 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1473 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1474 | dependencies: 1475 | crypto-random-string "^2.0.0" 1476 | 1477 | unpipe@1.0.0, unpipe@~1.0.0: 1478 | version "1.0.0" 1479 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1480 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1481 | 1482 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1483 | version "1.0.2" 1484 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1485 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1486 | 1487 | utils-merge@1.0.1: 1488 | version "1.0.1" 1489 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1490 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1491 | 1492 | uuid@^3.3.2: 1493 | version "3.3.3" 1494 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 1495 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 1496 | 1497 | vary@^1, vary@~1.1.2: 1498 | version "1.1.2" 1499 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1500 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1501 | 1502 | walkdir@^0.4.0: 1503 | version "0.4.1" 1504 | resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" 1505 | integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== 1506 | 1507 | websocket-driver@>=0.5.1: 1508 | version "0.7.3" 1509 | resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" 1510 | integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== 1511 | dependencies: 1512 | http-parser-js ">=0.4.0 <0.4.11" 1513 | safe-buffer ">=5.1.0" 1514 | websocket-extensions ">=0.1.1" 1515 | 1516 | websocket-extensions@>=0.1.1: 1517 | version "0.1.4" 1518 | resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" 1519 | integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== 1520 | 1521 | wrappy@1: 1522 | version "1.0.2" 1523 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1524 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1525 | 1526 | write-file-atomic@^3.0.0: 1527 | version "3.0.0" 1528 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.0.tgz#1b64dbbf77cb58fd09056963d63e62667ab4fb21" 1529 | integrity sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q== 1530 | dependencies: 1531 | imurmurhash "^0.1.4" 1532 | is-typedarray "^1.0.0" 1533 | signal-exit "^3.0.2" 1534 | typedarray-to-buffer "^3.1.5" 1535 | 1536 | xdg-basedir@^4.0.0: 1537 | version "4.0.0" 1538 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1539 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1540 | 1541 | xtend@^4.0.1, xtend@~4.0.1: 1542 | version "4.0.2" 1543 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1544 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1545 | 1546 | yallist@^3.0.2: 1547 | version "3.0.3" 1548 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 1549 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 1550 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": "node_modules/expo/AppEntry.js", 3 | "scripts": { 4 | "start": "expo start", 5 | "android": "expo start --android", 6 | "ios": "expo start --ios", 7 | "web": "expo start --web", 8 | "eject": "expo eject" 9 | }, 10 | "dependencies": { 11 | "expo": "^34.0.1", 12 | "react": "16.8.3", 13 | "react-dom": "^16.8.6", 14 | "react-native": "https://github.com/expo/react-native/archive/sdk-34.0.0.tar.gz", 15 | "react-native-paper": "^2.16.0", 16 | "react-native-web": "^0.11.4", 17 | "react-redux": "^7.1.1", 18 | "redux": "^4.0.4", 19 | "redux-observable": "^1.1.0", 20 | "rxjs": "^6.5.3" 21 | }, 22 | "devDependencies": { 23 | "babel-preset-expo": "^6.0.0" 24 | }, 25 | "private": true 26 | } 27 | -------------------------------------------------------------------------------- /src/api.js: -------------------------------------------------------------------------------- 1 | import { pipe, map } from "rxjs/operators"; 2 | import { ajax } from "rxjs/ajax"; 3 | 4 | const BASE_URL = 5 | "https://us-central1-redux-observable-todos.cloudfunctions.net/api"; 6 | 7 | export const getUser = () => ajax.getJSON(`${BASE_URL}/user`); 8 | export const getTodos = () => ajax.getJSON(`${BASE_URL}/todo`); 9 | export const addTodo = text => 10 | ajax({ 11 | url: `${BASE_URL}/todo`, 12 | method: "POST", 13 | body: { text } 14 | }).pipe(map(data => data.response)); 15 | 16 | export const completeTodo = id => 17 | ajax({ 18 | url: `${BASE_URL}/todo/${id}/complete`, 19 | method: "POST" 20 | }).pipe(map(data => data.response)); 21 | -------------------------------------------------------------------------------- /src/colors.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | "palevioletred", 3 | "springgreen", 4 | "goldenrod", 5 | "lightseagreen", 6 | "crimson", 7 | "orangered", 8 | "maroon", 9 | "chocolate", 10 | "midnightblue", 11 | "deeppink", 12 | "darkmagenta", 13 | "sienna", 14 | "cyan", 15 | "dodgerblue", 16 | "fuchsia", 17 | "yellowgreen", 18 | "tomato", 19 | "blueviolet", 20 | "lime", 21 | "orange", 22 | "springgreen", 23 | "teal" 24 | ]; 25 | -------------------------------------------------------------------------------- /src/components/Header.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect } from "react-redux"; 3 | import { Appbar } from "react-native-paper"; 4 | import { getUser } from "../store/actions"; 5 | 6 | class Header extends React.Component { 7 | componentDidMount() { 8 | this.props.getUser(); 9 | } 10 | render() { 11 | const { user } = this.props; 12 | return ( 13 | 14 | 15 | 16 | ); 17 | } 18 | } 19 | 20 | function mapStateToProps(state) { 21 | return { 22 | user: state.user 23 | }; 24 | } 25 | function mapDispatchToProps(dispatch) { 26 | return { 27 | getUser: () => dispatch(getUser()) 28 | }; 29 | } 30 | 31 | export default connect( 32 | mapStateToProps, 33 | mapDispatchToProps 34 | )(Header); 35 | -------------------------------------------------------------------------------- /src/components/TodoList.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { connect } from "react-redux"; 3 | import { View, SafeAreaView, ScrollView, StyleSheet } from "react-native"; 4 | import { TextInput, Button, Checkbox, Colors, Title } from "react-native-paper"; 5 | import { getTodos, completeTodo, addTodo } from "../store/actions"; 6 | import colors from "../colors"; 7 | import { white } from "ansi-colors"; 8 | 9 | class TodoList extends React.Component { 10 | state = { 11 | todo: "" 12 | }; 13 | 14 | componentDidMount() { 15 | this.props.getTodos(); 16 | } 17 | 18 | renderFormInput() { 19 | return ( 20 | 21 | this.setState({ todo })} 27 | /> 28 | 39 | 40 | ); 41 | } 42 | 43 | renderTodoItem(todo, index) { 44 | return ( 45 | 52 | { 57 | if (!todo.completed) { 58 | this.props.completeTodo(todo.id); 59 | } 60 | }} 61 | /> 62 | {todo.text} 63 | 64 | ); 65 | } 66 | 67 | render() { 68 | const { style, todos } = this.props; 69 | return ( 70 | 71 | {this.renderFormInput()} 72 | 73 | 74 | {todos.map((todo, idx) => this.renderTodoItem(todo, idx))} 75 | 76 | 77 | 78 | ); 79 | } 80 | } 81 | 82 | function mapStateToProps(state) { 83 | return { todos: state.todos }; 84 | } 85 | 86 | function mapDispatchToProps(dispatch) { 87 | return { 88 | getTodos: () => dispatch(getTodos()), 89 | completeTodo: id => dispatch(completeTodo(id)), 90 | addTodo: text => dispatch(addTodo(text)) 91 | }; 92 | } 93 | 94 | export default connect( 95 | mapStateToProps, 96 | mapDispatchToProps 97 | )(TodoList); 98 | 99 | const styles = StyleSheet.create({ 100 | inputContainer: { 101 | flexDirection: "row", 102 | alignItems: "center", 103 | padding: 16, 104 | backgroundColor: "#FAFAFA" 105 | }, 106 | input: { 107 | flex: 1, 108 | backgroundColor: "#FAFAFA" 109 | }, 110 | todoList: { 111 | flex: 1 112 | }, 113 | listItem: { 114 | padding: 16, 115 | flexDirection: "row" 116 | }, 117 | listItemText: { 118 | flex: 1, 119 | color: "white", 120 | fontWeight: "300" 121 | } 122 | }); 123 | -------------------------------------------------------------------------------- /src/store/actions.js: -------------------------------------------------------------------------------- 1 | export const GET_USER = "GET_USER"; 2 | export const GET_USER_SUCCESS = "GET_USER_SUCCESS"; 3 | export const GET_TODOS = "GET_TODOS"; 4 | export const GET_TODOS_SUCCESS = "GET_TODOS_SUCCESS"; 5 | export const ADD_TODO = "ADD_TODO"; 6 | export const ADD_TODO_SUCCESS = "ADD_TODO_SUCCESS"; 7 | export const COMPLETE_TODO = "COMPLETE_TODO"; 8 | export const COMPLETE_TODO_SUCCESS = "COMPLETE_TODO_SUCCESS"; 9 | 10 | export const getUser = () => ({ type: GET_USER }); 11 | export const getUserSuccess = user => ({ 12 | type: GET_USER_SUCCESS, 13 | payload: user 14 | }); 15 | export const getTodos = () => ({ type: GET_TODOS }); 16 | export const getTodosSuccess = todos => ({ 17 | type: GET_TODOS_SUCCESS, 18 | payload: todos 19 | }); 20 | export const addTodo = text => ({ type: ADD_TODO, payload: text }); 21 | export const addTodoSuccess = todo => ({ 22 | type: ADD_TODO_SUCCESS, 23 | payload: todo 24 | }); 25 | export const completeTodo = id => ({ type: COMPLETE_TODO, payload: id }); 26 | export const completeTodoSuccess = todo => ({ 27 | type: COMPLETE_TODO_SUCCESS, 28 | payload: todo 29 | }); 30 | -------------------------------------------------------------------------------- /src/store/store.js: -------------------------------------------------------------------------------- 1 | import { createStore, combineReducers, applyMiddleware } from "redux"; 2 | import { ofType, combineEpics, createEpicMiddleware } from "redux-observable"; 3 | import { map, flatMap } from "rxjs/operators"; 4 | import { ajax } from "rxjs/ajax"; 5 | 6 | import { 7 | GET_USER, 8 | GET_USER_SUCCESS, 9 | GET_TODOS, 10 | GET_TODOS_SUCCESS, 11 | ADD_TODO, 12 | ADD_TODO_SUCCESS, 13 | COMPLETE_TODO, 14 | COMPLETE_TODO_SUCCESS, 15 | getUserSuccess, 16 | getTodosSuccess, 17 | addTodoSuccess, 18 | completeTodoSuccess 19 | } from "./actions"; 20 | 21 | import * as Api from "../api"; 22 | 23 | function user(state = {}, action) { 24 | switch (action.type) { 25 | case GET_USER_SUCCESS: 26 | return action.payload; 27 | default: 28 | return state; 29 | } 30 | } 31 | 32 | function todos(state = [], action) { 33 | switch (action.type) { 34 | case GET_TODOS_SUCCESS: 35 | return action.payload; 36 | case ADD_TODO_SUCCESS: 37 | return [...state, action.payload]; 38 | case COMPLETE_TODO_SUCCESS: 39 | return state.map(todo => { 40 | if (todo.id === action.payload.id) { 41 | return { ...todo, completed: true }; 42 | } 43 | return todo; 44 | }); 45 | default: 46 | return state; 47 | } 48 | } 49 | 50 | const rootReducer = combineReducers({ user, todos }); 51 | 52 | const userEpic = action$ => 53 | action$.pipe( 54 | ofType(GET_USER), 55 | flatMap(() => Api.getUser()), 56 | map(user => getUserSuccess(user)) 57 | ); 58 | 59 | const getTodosEpic = action$ => 60 | action$.pipe( 61 | ofType(GET_TODOS), 62 | flatMap(() => Api.getTodos()), 63 | map(({ todos }) => getTodosSuccess(todos)) 64 | ); 65 | 66 | const addTodoEpic = action$ => 67 | action$.pipe( 68 | ofType(ADD_TODO), 69 | flatMap(action => Api.addTodo(action.payload)), 70 | map(todo => addTodoSuccess(todo)) 71 | ); 72 | 73 | const completeTodoEpic = action$ => 74 | action$.pipe( 75 | ofType(COMPLETE_TODO), 76 | flatMap(action => Api.completeTodo(action.payload)), 77 | map(todo => completeTodoSuccess(todo)) 78 | ); 79 | 80 | const rootEpic = combineEpics( 81 | userEpic, 82 | getTodosEpic, 83 | addTodoEpic, 84 | completeTodoEpic 85 | ); 86 | 87 | const epicMiddleware = createEpicMiddleware(); 88 | export const store = createStore(rootReducer, applyMiddleware(epicMiddleware)); 89 | epicMiddleware.run(rootEpic); 90 | --------------------------------------------------------------------------------