diff --git a/package.json b/package.json
index 774a312..e821749 100644
--- a/package.json
+++ b/package.json
@@ -11,11 +11,13 @@
},
"dependencies": {
"axios": "^0.18.0",
+ "lodash": "^4.17.11",
"mobx": "^5.5.0",
"mobx-react": "^5.2.8",
"prop-types": "^15.6.2",
"react": "^16.8.0",
"react-dom": "^16.8.0",
+ "react-select": "^2.3.0",
"route-parser": "^0.0.5"
},
"devDependencies": {
@@ -38,6 +40,7 @@
"html-webpack-plugin": "^3.2.0",
"jest": "^24.1.0",
"node-sass": "^4.11.0",
+ "prettier": "^1.16.4",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"webpack": "^4.15.0",
diff --git a/src/css/_form.scss b/src/css/_form.scss
index f86e7f8..497f510 100644
--- a/src/css/_form.scss
+++ b/src/css/_form.scss
@@ -1,4 +1,8 @@
#moco-bx-container {
+ input {
+ border-radius: 0;
+ }
+
.form-group {
width: 100%;
margin: 1rem 0;
@@ -9,8 +13,10 @@
margin-bottom: 0.25rem;
}
- input {
- padding: 0.5rem 0.75rem;
+ input, textarea {
+ padding: 0.25rem 0.5rem;
+ background-color: white;
+ border-color: #cccccc;
width: 100%;
}
@@ -42,6 +48,15 @@
}
}
+ input[name="hours"] {
+ width: 33%;
+ }
+
+ textarea[name="description"] {
+ resize: none;
+ width: 100%;
+ }
+
button {
display: inline-block;
padding: 6px 12px;
@@ -55,9 +70,14 @@
border-color: #7dc332;
cursor: pointer;
- &:hover {
+ &:hover:not(:disabled) {
background-color: #639a28;
border-color: #639a28;
}
+
+ &:disabled {
+ opacity: 0.65;
+ cursor: default;
+ }
}
}
diff --git a/src/js/api/Client.js b/src/js/api/Client.js
index 5a0e096..afafbc8 100644
--- a/src/js/api/Client.js
+++ b/src/js/api/Client.js
@@ -1,63 +1,26 @@
import axios from "axios"
-class Client {
- constructor() {
- this.client = axios.create({
- responseType: "json"
+export default class Client {
+ #client
+ #apiKey
+
+ constructor({ subdomain, apiKey, clientVersion }) {
+ this.#apiKey = apiKey
+ this.#client = axios.create({
+ responseType: "json",
+ baseURL: `https://${encodeURIComponent(
+ subdomain
+ )}.mocoapp.com/api/browser_extensions`,
+ headers: {
+ common: {
+ "x-api-key": apiKey,
+ "x-client-version": clientVersion
+ }
+ }
})
}
- registerStorage(storage) {
- storage.sync.get(["subdomain", "apiKey"], store => {
- this.setSubdomain(store.subdomain)
- this.setCredentials(store.apiKey)
- })
+ login = () => this.#client.post("session", { api_key: this.#apiKey })
- storage.onChanged.addListener(({ subdomain, apiKey }) => {
- subdomain && this.setSubdomain(subdomain.newValue)
- apiKey && this.setCredentials(apiKey.newValue)
- })
- }
-
- setSubdomain(subdomain) {
- this.client.defaults.baseURL = `https://${encodeURIComponent(
- subdomain
- )}.mocoapp.com/api/v1`
- }
-
- setCredentials(apiKey) {
- this.client.defaults.headers.common[
- "Authorization"
- ] = `Token token=${encodeURIComponent(apiKey)}`
- }
-
- setClientVersion(version) {
- this.client.defaults.headers.common["x-client-version"] = version
- }
-
- get defaults() {
- return this.client.defaults
- }
-
- get(url, config = {}) {
- return this.client.get(url, config)
- }
-
- post(url, data) {
- return this.client.post(url, data)
- }
-
- put(url, data) {
- return this.client.put(url, data)
- }
-
- patch(url, data) {
- return this.client.patch(url, data)
- }
-
- delete(url) {
- return this.client.delete(url)
- }
+ projects = () => this.#client.get("projects")
}
-
-export default new Client()
diff --git a/src/js/api/projects.js b/src/js/api/projects.js
deleted file mode 100644
index bcb7521..0000000
--- a/src/js/api/projects.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import client from './Client'
-
-export function getProjects(subdomain, apiKey) {
- return client.post(`https://${subdomain}.mocoapp.com/api/browser_extensions/session`, { api_key: apiKey })
-}
diff --git a/src/js/api/session.js b/src/js/api/session.js
deleted file mode 100644
index f85e93b..0000000
--- a/src/js/api/session.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import client from './Client'
-
-export function login(subdomain, apiKey) {
- return client.post(`https://${subdomain}.mocoapp.com/api/browser_extensions/session`, { api_key: apiKey })
-}
diff --git a/src/js/background.js b/src/js/background.js
index ca07fcd..2b0f2f8 100644
--- a/src/js/background.js
+++ b/src/js/background.js
@@ -1,11 +1,8 @@
import DomainCheck from "./services/DomainCheck"
-import apiClient from "api/client"
import config from "./config"
-apiClient.registerStorage(chrome.storage)
-apiClient.setClientVersion(chrome.runtime.getManifest().version)
-
const domainCheck = new DomainCheck(config)
+const { version } = chrome.runtime.getManifest()
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
// run only after the page is fully loaded
@@ -16,9 +13,16 @@ chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
const service = domainCheck.match(tab.url)
if (service) {
- chrome.tabs.sendMessage(tabId, { type: "mountBubble", service }, () => {
- console.log("bubble mounted")
- })
+ chrome.storage.sync.get(
+ ["subdomain", "apiKey"],
+ ({ subdomain, apiKey }) => {
+ const settings = { subdomain, apiKey, version }
+ const payload = { service, settings }
+ chrome.tabs.sendMessage(tabId, { type: "mountBubble", payload }, () => {
+ console.log("bubble mounted")
+ })
+ }
+ )
} else {
chrome.tabs.sendMessage(tabId, { type: "unmountBubble" }, () => {
console.log("bubble unmounted")
diff --git a/src/js/components/Bubble.js b/src/js/components/Bubble.js
index 6ac3e1f..5167599 100644
--- a/src/js/components/Bubble.js
+++ b/src/js/components/Bubble.js
@@ -1,42 +1,128 @@
import React, { Component } from "react"
+import PropTypes from "prop-types"
+import ApiClient from "api/Client"
import Modal, { Content } from "components/Modal"
import Form from "components/Form"
import { observable } from "mobx"
import { observer } from "mobx-react"
-import logoUrl from "../../images/logo.png"
+import logoUrl from "images/logo.png"
+import get from "lodash/get"
+import { findLastProject, findLastTask, groupedProjectOptions } from "utils"
@observer
class Bubble extends Component {
- @observable open = false
+ static propTypes = {
+ settings: PropTypes.shape({
+ subdomain: PropTypes.string,
+ apiKey: PropTypes.string,
+ version: PropTypes.string
+ })
+ };
- onOpen = _event => {
- this.open = true
- }
-
- onClose = _event => {
- this.open = false
- }
+ @observable isLoading = true;
+ @observable isOpen = false;
+ @observable userSettings;
+ @observable projects;
+ @observable tasks = [];
+ @observable changeset = {
+ project: null,
+ task: null,
+ hours: '',
+ description: ''
+ };
componentDidMount() {
- console.log(this.props.service)
+ const { settings } = this.props
+ this.apiClient = new ApiClient(settings)
+ this.fetchData()
+ window.addEventListener("keydown", this.handleKeyDown)
}
+ componentWillUnmount() {
+ window.removeEventListener("keydown", this.handleKeyDown)
+ }
+
+ open = _event => {
+ this.isOpen = true
+ };
+
+ close = _event => {
+ this.isOpen = false
+ };
+
+ fetchData = () => {
+ Promise.all([this.apiClient.login(), this.apiClient.projects()])
+ .then(responses => {
+ this.userSettings = get(responses, "[0].data")
+ this.projects = groupedProjectOptions(
+ get(responses, "[1].data.projects")
+ )
+
+ const {
+ last_project_id: lastProjectId,
+ last_task_id: lastTaskId
+ } = this.userSettings
+
+ this.changeset.project = findLastProject(lastProjectId)(this.projects)
+ this.changeset.task = findLastTask(lastTaskId)(this.changeset.project)
+
+ this.isLoading = false
+ })
+ .catch(console.error)
+ };
+
+ // EVENT HANDLERS -----------------------------------------------------------
+
+ handleKeyDown = event => {
+ if (event.keyCode === 27) {
+ this.close()
+ }
+ };
+
+ handleChange = event => {
+ const {
+ target: { name, value }
+ } = event
+
+ this.changeset[name] = value
+
+ if (name === "project") {
+ this.changeset.task = null
+ this.tasks = value.tasks
+ }
+ };
+
+ handleSubmit = event => {
+ event.preventDefault()
+ this.close()
+ };
+
// RENDER -------------------------------------------------------------------
render() {
+ if (this.isLoading) {
+ return null
+ }
+
return (
<>
- {this.open && (
+ {this.isOpen && (
-
-
+
)}
diff --git a/src/js/components/Form.js b/src/js/components/Form.js
index 9f764f7..00cee45 100644
--- a/src/js/components/Form.js
+++ b/src/js/components/Form.js
@@ -1,38 +1,83 @@
-import React, { Component } from 'react'
-import PropTypes from 'prop-types'
-import { login } from 'api/session'
-import { observable } from 'mobx'
-import { observer } from 'mobx-react'
+import React, { Component } from "react"
+import PropTypes from "prop-types"
+import Select from "components/Select"
-@observer
class Form extends Component {
- @observable loading = true
-
static propTypes = {
- inline: PropTypes.bool,
- }
+ isLoading: PropTypes.bool.isRequired,
+ changeset: PropTypes.shape({
+ project: PropTypes.object,
+ task: PropTypes.object,
+ hours: PropTypes.string
+ }).isRequired,
+ projects: PropTypes.array.isRequired,
+ tasks: PropTypes.array.isRequired,
+ onChange: PropTypes.func.isRequired,
+ onSubmit: PropTypes.func.isRequired
+ };
static defaultProps = {
- inline: true,
- }
+ inline: true
+ };
- componentDidMount() {
- chrome.storage.sync.get(null, (store) => {
- login(store.subdomain, store.api_key)
- .then((response) => this.loading = false)
- .catch((error) => console.log(error))
- })
- }
+ isValid = () => {
+ const { changeset } = this.props
+ return ["project", "task", "hours", "description"]
+ .map(prop => changeset[prop])
+ .every(Boolean)
+ };
// RENDER -------------------------------------------------------------------
render() {
- if (this.loading) return null
+ if (this.isLoading) {
+ return null
+ }
+
+ const { projects, tasks, changeset, onChange, onSubmit } = this.props
return (
-
- This is the Form {this.props.inline ? INLINE : DEDICATED}.
-
+
)
}
}
diff --git a/src/js/components/Select.js b/src/js/components/Select.js
new file mode 100644
index 0000000..5e931ed
--- /dev/null
+++ b/src/js/components/Select.js
@@ -0,0 +1,66 @@
+import React, { Component } from "react"
+import PropTypes from "prop-types"
+import ReactSelect, { createFilter } from "react-select"
+import {
+ values,
+ isString,
+ isNumber,
+ join,
+ filter,
+ compose,
+ property
+} from "lodash/fp"
+
+const customTheme = theme => ({
+ ...theme,
+ borderRadius: 0,
+ spacing: {
+ ...theme.spacing,
+ baseUnit: 2,
+ controlHeight: 34
+ }
+})
+
+const customStyles = {
+ groupHeading: (base, _state) => ({
+ ...base,
+ color: "black",
+ textTransform: "none",
+ fontWeight: "bold",
+ fontSize: "100%"
+ })
+}
+
+const filterOption = createFilter({
+ stringify: compose(
+ join(" "),
+ filter(value => isString(value) || isNumber(value)),
+ values,
+ property("data")
+ )
+})
+
+export default class Select extends Component {
+ static propTypes = {
+ name: PropTypes.string.isRequired,
+ onChange: PropTypes.func.isRequired
+ }
+
+ handleChange = value => {
+ const { name, onChange } = this.props
+ onChange({ target: { name, value } })
+ }
+
+ render() {
+ const passThroughProps = this.props
+ return (
+
+ )
+ }
+}
diff --git a/src/js/containers/App.js b/src/js/containers/App.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/js/content.js b/src/js/content.js
index 1988f11..aa33e61 100644
--- a/src/js/content.js
+++ b/src/js/content.js
@@ -3,10 +3,10 @@ import ReactDOM from "react-dom"
import Bubble from "./components/Bubble"
import "../css/main.scss"
-chrome.runtime.onMessage.addListener(({ type, service }) => {
+chrome.runtime.onMessage.addListener(({ type, payload }) => {
switch (type) {
case "mountBubble": {
- return mountBubble(service)
+ return mountBubble(payload)
}
case "unmountBubble": {
@@ -15,7 +15,7 @@ chrome.runtime.onMessage.addListener(({ type, service }) => {
}
})
-const mountBubble = service => {
+const mountBubble = ({ service, settings }) => {
if (document.getElementById("moco-bx-bubble")) {
return
}
@@ -28,7 +28,7 @@ const mountBubble = service => {
domBubble.setAttribute("id", "moco-bx-bubble")
document.body.appendChild(domBubble)
- ReactDOM.render(createElement(Bubble, { service }), domBubble)
+ ReactDOM.render(createElement(Bubble, { service, settings }), domBubble)
}
const unmountBubble = () => {
diff --git a/src/js/utils.js b/src/js/utils.js
new file mode 100644
index 0000000..8a87dcd
--- /dev/null
+++ b/src/js/utils.js
@@ -0,0 +1,57 @@
+import {
+ groupBy,
+ compose,
+ map,
+ toPairs,
+ flatMap,
+ pathEq,
+ get,
+ find,
+ curry
+} from "lodash/fp"
+
+const nilToArray = input => input || []
+
+export const findLastProject = id =>
+ compose(
+ find(pathEq("value", id)),
+ flatMap(get("options"))
+ )
+
+export const findLastTask = id =>
+ compose(
+ find(pathEq("value", id)),
+ get("tasks")
+ )
+
+function taskOptions(tasks) {
+ return tasks.map(({ id, name }) => ({
+ label: name,
+ value: id
+ }))
+}
+
+export function projectOptions(projects) {
+ return projects.map(project => ({
+ value: project.id,
+ label: project.name,
+ customerName: project.customer_name,
+ tasks: taskOptions(project.tasks)
+ }))
+}
+
+export const groupedProjectOptions = compose(
+ map(([customerName, projects]) => ({
+ label: customerName,
+ options: projectOptions(projects)
+ })),
+ toPairs,
+ groupBy("customer_name"),
+ nilToArray
+)
+
+export const trace = curry((tag, value) => {
+ // eslint-disable-next-line no-console
+ console.log(tag, value)
+ return value
+})
diff --git a/test/data.js b/test/data.js
new file mode 100644
index 0000000..b783cf4
--- /dev/null
+++ b/test/data.js
@@ -0,0 +1,108 @@
+export const projects = [
+ {
+ id: 944868981,
+ name: "Browser Extension",
+ customer_name: "Simplificator",
+ intern: false,
+ identifier: "137",
+ tasks: [
+ {
+ id: 2733682,
+ name: "Bugfixing",
+ billable: true
+ },
+ {
+ id: 2733681,
+ name: "Development",
+ billable: true
+ }
+ ]
+ },
+ {
+ id: 944724773,
+ name: "Development",
+ customer_name: "MOCO APP",
+ intern: false,
+ identifier: "116",
+ tasks: [
+ {
+ id: 1621304,
+ name: "Roadmap Features",
+ billable: true
+ },
+ {
+ id: 1621310,
+ name: "Bugfixing",
+ billable: true
+ },
+ {
+ id: 1621305,
+ name: "Quickwins",
+ billable: true
+ },
+ {
+ id: 1621323,
+ name: "Refactorings",
+ billable: true
+ }
+ ]
+ },
+ {
+ id: 944837106,
+ name: "Support",
+ customer_name: "MOCO APP",
+ intern: false,
+ identifier: "130",
+ tasks: [
+ {
+ id: 2500080,
+ name: "Intercom & Mails",
+ billable: false
+ },
+ {
+ id: 2500081,
+ name: "Demos",
+ billable: false
+ },
+ {
+ id: 2506050,
+ name: "Calls",
+ billable: false
+ },
+ {
+ id: 2500084,
+ name: "Importe",
+ billable: false
+ }
+ ]
+ },
+ {
+ id: 944621413,
+ name: "Tech Consulting",
+ customer_name: "sharoo",
+ intern: false,
+ identifier: "97",
+ tasks: [
+ {
+ id: 874014,
+ name: "Entwicklung",
+ billable: true
+ },
+ {
+ id: 874015,
+ name: "Grafik",
+ billable: true
+ },
+ {
+ id: 874016,
+ name: "Konzept",
+ billable: true
+ },
+ {
+ id: 874017,
+ name: "Projektleitung",
+ billable: true
+ }
+ ]
+ }
+]
diff --git a/test/utils.test.js b/test/utils.test.js
new file mode 100644
index 0000000..9e33f0d
--- /dev/null
+++ b/test/utils.test.js
@@ -0,0 +1,65 @@
+import { projects } from "./data"
+import {
+ findLastProject,
+ findLastTask,
+ groupedProjectOptions
+} from "../src/js/utils"
+import { map } from "lodash/fp"
+
+describe("utils", () => {
+ describe("findLastProject", () => {
+ it("finds an existing project", () => {
+ const options = groupedProjectOptions(projects)
+ const project = findLastProject(944837106)(options)
+ expect(project.value).toEqual(944837106)
+ expect(project.label).toEqual("Support")
+ expect(project.customerName).toEqual("MOCO APP")
+ expect(project.tasks).toHaveLength(4)
+ })
+
+ it("returns undefined if project is not found", () => {
+ const options = groupedProjectOptions(projects)
+ const project = findLastProject(123)(options)
+ expect(project).toBe(undefined)
+ })
+
+ it("returns undefined for undefined id", () => {
+ const options = groupedProjectOptions(projects)
+ const project = findLastProject(undefined)(options)
+ expect(project).toBe(undefined)
+ })
+ })
+
+ describe("findLastTask", () => {
+ it("find an existing task", () => {
+ const options = groupedProjectOptions(projects)
+ const project = findLastProject(944837106)(options)
+ const task = findLastTask(2506050)(project)
+ expect(task.value).toEqual(2506050)
+ expect(task.label).toEqual("Calls")
+ })
+
+ it("returns undefined if task is not found", () => {
+ const options = groupedProjectOptions(projects)
+ const project = findLastProject(944837106)(options)
+ const task = findLastTask(123)(project)
+ expect(task).toBe(undefined)
+ })
+
+ it("returns undefined for undefined project", () => {
+ const task = findLastTask(2506050)(undefined)
+ expect(task).toBe(undefined)
+ })
+ })
+
+ describe("groupedProjectOptions", () => {
+ it("transforms projects into grouped options by company", () => {
+ const result = groupedProjectOptions(projects)
+ expect(map("label", result)).toEqual([
+ "Simplificator",
+ "MOCO APP",
+ "sharoo"
+ ])
+ })
+ })
+})
diff --git a/webpack.config.js b/webpack.config.js
index 8380f77..55386ba 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -78,7 +78,7 @@ module.exports = {
resolve: {
modules: [path.join(__dirname, "src/js"), "node_modules"],
alias: {
- images: path.join(__dirname, 'src/images')
+ images: path.join(__dirname, "src/images")
}
},
// webpack creates sourcemaps by default and evals js code
diff --git a/yarn.lock b/yarn.lock
index e4e1e7e..79e717b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -652,6 +652,13 @@
"@babel/plugin-transform-react-jsx-self" "^7.0.0"
"@babel/plugin-transform-react-jsx-source" "^7.0.0"
+"@babel/runtime@^7.1.2":
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a"
+ integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==
+ dependencies:
+ regenerator-runtime "^0.12.0"
+
"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2":
version "7.2.2"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907"
@@ -685,6 +692,53 @@
lodash "^4.17.10"
to-fast-properties "^2.0.0"
+"@emotion/babel-utils@^0.6.4":
+ version "0.6.10"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-utils/-/babel-utils-0.6.10.tgz#83dbf3dfa933fae9fc566e54fbb45f14674c6ccc"
+ integrity sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==
+ dependencies:
+ "@emotion/hash" "^0.6.6"
+ "@emotion/memoize" "^0.6.6"
+ "@emotion/serialize" "^0.9.1"
+ convert-source-map "^1.5.1"
+ find-root "^1.1.0"
+ source-map "^0.7.2"
+
+"@emotion/hash@^0.6.2", "@emotion/hash@^0.6.6":
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.6.6.tgz#62266c5f0eac6941fece302abad69f2ee7e25e44"
+ integrity sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==
+
+"@emotion/memoize@^0.6.1", "@emotion/memoize@^0.6.6":
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.6.6.tgz#004b98298d04c7ca3b4f50ca2035d4f60d2eed1b"
+ integrity sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==
+
+"@emotion/serialize@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.9.1.tgz#a494982a6920730dba6303eb018220a2b629c145"
+ integrity sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==
+ dependencies:
+ "@emotion/hash" "^0.6.6"
+ "@emotion/memoize" "^0.6.6"
+ "@emotion/unitless" "^0.6.7"
+ "@emotion/utils" "^0.8.2"
+
+"@emotion/stylis@^0.7.0":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.7.1.tgz#50f63225e712d99e2b2b39c19c70fff023793ca5"
+ integrity sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ==
+
+"@emotion/unitless@^0.6.2", "@emotion/unitless@^0.6.7":
+ version "0.6.7"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.6.7.tgz#53e9f1892f725b194d5e6a1684a7b394df592397"
+ integrity sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==
+
+"@emotion/utils@^0.8.2":
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.8.2.tgz#576ff7fb1230185b619a75d258cbc98f0867a8dc"
+ integrity sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw==
+
"@webassemblyjs/ast@1.7.11":
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
@@ -1148,6 +1202,24 @@ babel-loader@^8.0.4:
mkdirp "^0.5.1"
util.promisify "^1.0.0"
+babel-plugin-emotion@^9.2.11:
+ version "9.2.11"
+ resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz#319c005a9ee1d15bb447f59fe504c35fd5807728"
+ integrity sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.0.0"
+ "@emotion/babel-utils" "^0.6.4"
+ "@emotion/hash" "^0.6.2"
+ "@emotion/memoize" "^0.6.1"
+ "@emotion/stylis" "^0.7.0"
+ babel-plugin-macros "^2.0.0"
+ babel-plugin-syntax-jsx "^6.18.0"
+ convert-source-map "^1.5.0"
+ find-root "^1.1.0"
+ mkdirp "^0.5.1"
+ source-map "^0.5.7"
+ touch "^2.0.1"
+
babel-plugin-istanbul@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30"
@@ -1162,6 +1234,14 @@ babel-plugin-jest-hoist@^24.1.0:
resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8"
integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw==
+babel-plugin-macros@^2.0.0:
+ version "2.4.5"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.5.tgz#7000a9b1f72d19ceee19a5804f1d23d6daf38c13"
+ integrity sha512-+/9yteNQw3yuZ3krQUfjAeoT/f4EAdn3ELwhFfDj0rTMIaoHfIdrcLePOfIaL0qmFLpIcgPIL2Lzm58h+CGWaw==
+ dependencies:
+ cosmiconfig "^5.0.5"
+ resolve "^1.8.1"
+
babel-plugin-module-resolver@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.3.tgz#5a1c148bf528d20907ed508b70ae3c4762e78c8d"
@@ -1173,6 +1253,11 @@ babel-plugin-module-resolver@^3.1.1:
reselect "^3.0.1"
resolve "^1.4.0"
+babel-plugin-syntax-jsx@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+ integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
+
babel-preset-jest@^24.1.0:
version "24.1.0"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e"
@@ -1447,6 +1532,25 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
+caller-callsite@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+ integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+ dependencies:
+ callsites "^2.0.0"
+
+caller-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+ integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+ dependencies:
+ caller-callsite "^2.0.0"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+ integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
+
callsites@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3"
@@ -1590,6 +1694,11 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
+classnames@^2.2.5:
+ version "2.2.6"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+ integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
+
clean-css@4.2.x:
version "4.2.1"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
@@ -1748,7 +1857,7 @@ constants-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-convert-source-map@^1.1.0, convert-source-map@^1.4.0:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
version "1.6.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
@@ -1803,6 +1912,16 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+cosmiconfig@^5.0.5:
+ version "5.0.7"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
+ integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
+ dependencies:
+ import-fresh "^2.0.0"
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+
create-ecdh@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
@@ -1811,6 +1930,19 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.0.0"
+create-emotion@^9.2.12:
+ version "9.2.12"
+ resolved "https://registry.yarnpkg.com/create-emotion/-/create-emotion-9.2.12.tgz#0fc8e7f92c4f8bb924b0fef6781f66b1d07cb26f"
+ integrity sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA==
+ dependencies:
+ "@emotion/hash" "^0.6.2"
+ "@emotion/memoize" "^0.6.1"
+ "@emotion/stylis" "^0.7.0"
+ "@emotion/unitless" "^0.6.2"
+ csstype "^2.5.2"
+ stylis "^3.5.0"
+ stylis-rule-sheet "^0.0.10"
+
create-hash@^1.1.0, create-hash@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
@@ -1936,6 +2068,11 @@ cssstyle@^1.0.0:
dependencies:
cssom "0.3.x"
+csstype@^2.5.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.2.tgz#3043d5e065454579afc7478a18de41909c8a2f01"
+ integrity sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow==
+
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@@ -2114,6 +2251,13 @@ dom-converter@~0.2:
dependencies:
utila "~0.4"
+dom-helpers@^3.3.1:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
+ integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+
dom-serializer@0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -2207,6 +2351,14 @@ emojis-list@^2.0.0:
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
+emotion@^9.1.2:
+ version "9.2.12"
+ resolved "https://registry.yarnpkg.com/emotion/-/emotion-9.2.12.tgz#53925aaa005614e65c6e43db8243c843574d1ea9"
+ integrity sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ==
+ dependencies:
+ babel-plugin-emotion "^9.2.11"
+ create-emotion "^9.2.12"
+
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
@@ -2643,6 +2795,11 @@ find-cache-dir@^2.0.0:
make-dir "^1.0.0"
pkg-dir "^3.0.0"
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -3163,6 +3320,14 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+import-fresh@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+ integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+ dependencies:
+ caller-path "^2.0.0"
+ resolve-from "^3.0.0"
+
import-fresh@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390"
@@ -3357,6 +3522,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+ integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@@ -3917,7 +4087,7 @@ js-levenshtein@^1.1.3:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.12.0:
+js-yaml@^3.12.0, js-yaml@^3.9.0:
version "3.12.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600"
integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==
@@ -4190,7 +4360,7 @@ lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3,
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@@ -4288,6 +4458,11 @@ mem@^4.0.0:
mimic-fn "^1.0.0"
p-is-promise "^2.0.0"
+memoize-one@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906"
+ integrity sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA==
+
memory-fs@^0.4.0, memory-fs@~0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -4702,6 +4877,13 @@ nopt@^4.0.1:
abbrev "1"
osenv "^0.1.4"
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+ dependencies:
+ abbrev "1"
+
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
version "2.4.2"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2"
@@ -5224,6 +5406,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+prettier@^1.16.4:
+ version "1.16.4"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717"
+ integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==
+
pretty-error@^2.0.2:
version "2.1.1"
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
@@ -5273,7 +5460,7 @@ prompts@^2.0.1:
kleur "^3.0.0"
sisteransi "^1.0.0"
-prop-types@^15.6.2:
+prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2:
version "15.6.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==
@@ -5363,6 +5550,13 @@ querystring@0.2.0:
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+raf@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
+ integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
+ dependencies:
+ performance-now "^2.1.0"
+
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
@@ -5398,16 +5592,46 @@ react-dom@^16.8.0:
prop-types "^15.6.2"
scheduler "^0.13.0"
+react-input-autosize@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
+ integrity sha512-3+K4CD13iE4lQQ2WlF8PuV5htfmTRLH6MDnfndHM6LuBRszuXnuyIfE7nhSKt8AzRBZ50bu0sAhkNMeS5pxQQA==
+ dependencies:
+ prop-types "^15.5.8"
+
react-is@^16.7.0:
version "16.7.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa"
integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==
-react-lifecycles-compat@^3.0.2:
+react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
+react-select@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/react-select/-/react-select-2.3.0.tgz#990429622445eb2b4a6e985b8069fe7d498cae91"
+ integrity sha512-CD3jyZs5lwy/CHW3SdYU1d1FtmJxgvVPdKMwEE8dD6MyNANFtvW95P/V20StPsPppFY7oePv/i2Mun2C2+WgTA==
+ dependencies:
+ classnames "^2.2.5"
+ emotion "^9.1.2"
+ memoize-one "^4.0.0"
+ prop-types "^15.6.0"
+ raf "^3.4.0"
+ react-input-autosize "^2.2.1"
+ react-transition-group "^2.2.1"
+
+react-transition-group@^2.2.1:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.3.tgz#26de363cab19e5c88ae5dbae105c706cf953bb92"
+ integrity sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==
+ dependencies:
+ dom-helpers "^3.3.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+ react-lifecycles-compat "^3.0.4"
+
react@^16.8.0:
version "16.8.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.8.0.tgz#8533f0e4af818f448a276eae71681d09e8dd970a"
@@ -5520,6 +5744,11 @@ regenerate@^1.2.1, regenerate@^1.4.0:
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+regenerator-runtime@^0.12.0:
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
+ integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
+
regenerator-transform@^0.13.3:
version "0.13.3"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb"
@@ -5724,7 +5953,7 @@ resolve@1.1.7:
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-resolve@^1.3.2, resolve@^1.4.0, resolve@^1.9.0:
+resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1, resolve@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
@@ -6058,7 +6287,7 @@ source-map@^0.4.2:
dependencies:
amdefine ">=0.0.4"
-source-map@^0.5.0, source-map@^0.5.6:
+source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -6068,6 +6297,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+source-map@^0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
spdx-correct@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
@@ -6294,6 +6528,16 @@ style-loader@^0.23.1:
loader-utils "^1.1.0"
schema-utils "^1.0.0"
+stylis-rule-sheet@^0.0.10:
+ version "0.0.10"
+ resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
+ integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==
+
+stylis@^3.5.0:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
+ integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -6470,6 +6714,13 @@ toposort@^1.0.0:
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
+touch@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-2.0.2.tgz#ca0b2a3ae3211246a61b16ba9e6cbf1596287164"
+ integrity sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A==
+ dependencies:
+ nopt "~1.0.10"
+
tough-cookie@>=2.3.3:
version "3.0.1"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2"