From ddf280eed632121df748e54d960939abf531fb41 Mon Sep 17 00:00:00 2001
From: Jure Triglav <juretriglav@gmail.com>
Date: Sat, 25 Jul 2020 22:44:18 +0200
Subject: [PATCH] style: fix linting issues

---
 app/Root.jsx                                  |  28 +-
 .../src/MentionsInput/MentionsInput.jsx       |  10 +-
 .../src/Messages/MessageRenderer.jsx          | 116 +----
 .../component-chat/src/Messages/Messages.jsx  |  10 +-
 .../src/SuperChatInput/SuperChatInput.jsx     |  47 +-
 .../src/components/ComponentProperties.jsx    |   1 +
 .../src/components/FormBuilder.jsx            |  31 --
 .../src/redux/FormBuilder.js                  | 270 +++++-----
 app/components/component-login/src/Login.jsx  |  37 +-
 .../component-profile/src/FormGrid.jsx        |   1 -
 .../component-profile/src/PageWithHeader.jsx  |   4 +-
 .../component-profile/src/Profile.jsx         |   4 +-
 .../component-profile/src/ProfileImage.jsx    |   1 -
 .../src/components/ReviewersPage.js           |   2 +-
 .../src/components/NewSubmissionPage.jsx      |  35 +-
 app/components/component-submit/src/upload.js |   4 -
 .../src/components/Team.jsx                   |   3 +-
 .../src/UsersManager.jsx                      |   1 -
 app/components/shared/Pagination.jsx          |   1 -
 package.json                                  |   4 +-
 yarn.lock                                     | 462 ++++++++++--------
 21 files changed, 459 insertions(+), 613 deletions(-)

diff --git a/app/Root.jsx b/app/Root.jsx
index 3d73ac54e5..339ec005f0 100644
--- a/app/Root.jsx
+++ b/app/Root.jsx
@@ -1,33 +1,9 @@
 /* eslint-disable no-param-reassign */
 import React from 'react'
-// import { BrowserRouter } from 'react-router-dom'
-// import PropTypes from 'prop-types'
-// import { ThemeProvider } from 'styled-components'
-// import { ApolloProvider } from '@apollo/react-components'
-// import { ApolloClient } from 'apollo-client'
-// import { WebSocketLink } from 'apollo-link-ws'
-// import { split, ApolloLink } from 'apollo-link'
-// import { getMainDefinition } from 'apollo-utilities'
-// import { setContext } from 'apollo-link-context'
-// import {
-//   InMemoryCache,
-//   IntrospectionFragmentMatcher,
-// } from 'apollo-cache-inmemory'
-// import { createUploadLink } from 'apollo-upload-client'
-import GlobalStyle from './theme/elements/GlobalStyle'
-
-// import introspectionQueryResultData from './fragmentTypes.json'
-
 import { BrowserRouter } from 'react-router-dom'
 import PropTypes from 'prop-types'
 import { ThemeProvider } from 'styled-components'
-import {
-  ApolloProvider,
-  ApolloClient,
-  ApolloLink,
-  split,
-  gql,
-} from '@apollo/client'
+import { ApolloProvider, ApolloClient, ApolloLink, split } from '@apollo/client'
 // import { ApolloClient } from 'apollo-client'
 import { WebSocketLink } from '@apollo/client/link/ws'
 // import { split, ApolloLink } from 'apollo-link'
@@ -36,7 +12,7 @@ import { setContext } from '@apollo/client/link/context'
 import { InMemoryCache } from '@apollo/client/cache'
 import { createUploadLink } from 'apollo-upload-client'
 
-import { GET_CURRENT_USER } from './queries'
+import GlobalStyle from './theme/elements/GlobalStyle'
 import currentRolesVar from './shared/currentRolesVar'
 
 // See https://github.com/apollographql/apollo-feature-requests/issues/6#issuecomment-465305186
diff --git a/app/components/component-chat/src/MentionsInput/MentionsInput.jsx b/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
index 3334f25748..b7a0113fa1 100644
--- a/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
+++ b/app/components/component-chat/src/MentionsInput/MentionsInput.jsx
@@ -29,7 +29,8 @@ const cleanSuggestionUserObject = user => {
     ...user,
     id: user.username,
     display: user.username,
-    filterName: (user.name && user.name.toLowerCase()) || user.username.toLowerCase(),
+    filterName:
+      (user.name && user.name.toLowerCase()) || user.username.toLowerCase(),
   }
 }
 
@@ -82,8 +83,9 @@ const CustomMentionsInput = props => {
       return
     }
 
-    const cleanSearchUsers = rawSearchUsers.map(user => cleanSuggestionUserObject(user))
-
+    const cleanSearchUsers = rawSearchUsers.map(user =>
+      cleanSuggestionUserObject(user),
+    )
 
     // Prepend the filtered participants in case a user is tabbing down right now
     const fullResults = [...staticSuggestions, ...cleanSearchUsers]
@@ -116,9 +118,9 @@ const CustomMentionsInput = props => {
     >
       <Mention
         appendSpaceOnAdd
+        data={searchUsers}
         displayTransform={username => `@${username}`}
         markup="@[__id__]"
-        data={searchUsers}
         renderSuggestion={(
           entry,
           search,
diff --git a/app/components/component-chat/src/Messages/MessageRenderer.jsx b/app/components/component-chat/src/Messages/MessageRenderer.jsx
index 03c2f6624f..4e801f4ecc 100644
--- a/app/components/component-chat/src/Messages/MessageRenderer.jsx
+++ b/app/components/component-chat/src/Messages/MessageRenderer.jsx
@@ -1,118 +1,8 @@
 import React from 'react'
 import ReactMarkdown from 'react-markdown'
-import htmlParser from 'react-markdown/plugins/html-parser'
-import { useQuery } from '@apollo/client'
-import gql from 'graphql-tag'
-import styled from 'styled-components'
-import { th } from '@pubsweet/ui-toolkit'
 
-import PaperEmbed from './PaperEmbed'
-
-import { AspectRatio, EmbedContainer, EmbedComponent } from './style'
-
-const ExternalEmbed = props => {
-  let { aspectratio, url, src, width = '100%', height = 200 } = props
-
-  if (!src && url) src = url
-  if (typeof src !== 'string') return null
-
-  // if an aspect ratio is passed in, we need to use the EmbedComponent which does some trickery with padding to force an aspect ratio. Otherwise we should just use a regular iFrame
-  if (aspectratio && aspectratio !== undefined) {
-    return (
-      <AspectRatio ratio={aspectratio} style={{ height }}>
-        <EmbedComponent
-          allowFullScreen
-          frameBorder="0"
-          height={height}
-          src={src}
-          title={`iframe-${src}`}
-          width={width}
-        />
-      </AspectRatio>
-    )
-  }
-  return (
-    <EmbedContainer style={{ height }}>
-      <iframe
-        allowFullScreen
-        frameBorder="0"
-        height={height}
-        src={src}
-        title={`iframe-${src}`}
-        width={width}
-      />
-    </EmbedContainer>
-  )
-}
-
-const InternalEmbed = props => {
-  if (props.entity !== 'thread') return null
-  return 'INTERNAL'
-  // return <ThreadAttachment id={props.id} />
-}
-
-const Embed = props => {
-  // if (props.type === 'internal') {
-  //   return <InternalEmbed {...props} />
-  // }
-
-  // if (props.type === 'paper') {
-  //   return <PaperEmbed {...props} />
-  // }
-  return <></>
-  // return <ExternalEmbed {...props} />
-}
-
-// var preprocessingInstructions = [
-//   {
-//     shouldPreprocessNode: function (node) {
-//       return node.attribs && node.attribs['data-process'] === 'shared';
-//     },
-//     preprocessNode: function (node) {
-//       node.attribs = {id: `preprocessed-${node.attribs.id}`,};
-//     },
-//   }
-// ];
-const processingInstructions = [
-  {
-    shouldProcessNode(node) {
-      return node.name === 'embed'
-    },
-    processNode(node, children, index) {
-      return <Embed {...node.attribs} id={node.attribs.id} key={index} />
-    },
-  },
-  {
-    shouldProcessNode(node) {
-      return node.name === 'p'
-    },
-    processNode(node, children, index) {
-      return (
-        <div {...node.attribs} id={node.attribs.id} key={index}>
-          {children}
-        </div>
-      )
-    },
-  },
-]
-
-const parseHtml = htmlParser({
-  processingInstructions,
-})
-
-const MessageRenderer = React.memo(({ message }) => {
-  const p = props => <div>{props.children}</div>
-
-  return message.enhanced ? (
-    <ReactMarkdown
-      astPlugins={[parseHtml]}
-      escapeHtml={false}
-      renderers={{ paragraph: p }}
-      source={message.enhanced}
-    />
-  ) : (
-    <ReactMarkdown source={message.content} />
-  )
-})
+const MessageRenderer = React.memo(({ message }) => (
+  <ReactMarkdown source={message.content} />
+))
 
 export default MessageRenderer
diff --git a/app/components/component-chat/src/Messages/Messages.jsx b/app/components/component-chat/src/Messages/Messages.jsx
index 380869ac63..89a2fa0bbe 100644
--- a/app/components/component-chat/src/Messages/Messages.jsx
+++ b/app/components/component-chat/src/Messages/Messages.jsx
@@ -77,7 +77,6 @@ const MESSAGES_SUBSCRIPTION = gql`
   }
 `
 
-
 const subscribeToNewMessages = (subscribeToMore, channelId) =>
   subscribeToMore({
     document: MESSAGES_SUBSCRIPTION,
@@ -175,7 +174,10 @@ const Messages = ({ channelId }) => {
         </NextPageButton>
       )}
       {messages && !messages.length && (
-        <Placeholder>No discussion for this manuscript yet. Start by typing a message below.</Placeholder>
+        <Placeholder>
+          No discussion for this manuscript yet. Start by typing a message
+          below.
+        </Placeholder>
       )}
       {messages.map(group => {
         const initialMessage = group[0]
@@ -202,7 +204,9 @@ const Messages = ({ channelId }) => {
                   {index === 0 && <UserAvatar user={message.user} />}
                 </GutterContainer>
                 <InnerMessageContainer>
-                  {index === 0 && <Byline>{message.user.defaultIdentity.name}</Byline>}
+                  {index === 0 && (
+                    <Byline>{message.user.defaultIdentity.name}</Byline>
+                  )}
                   <Bubble>
                     <MessageRenderer message={message} />
                   </Bubble>
diff --git a/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx b/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
index eff4db7973..f84d21a878 100644
--- a/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
+++ b/app/components/component-chat/src/SuperChatInput/SuperChatInput.jsx
@@ -23,7 +23,7 @@ import {
   RemovePreviewButton,
 } from './style'
 
-import { CREATE_MESSAGE, GET_MESSAGE_BY_ID } from '../../../../queries'
+import { CREATE_MESSAGE } from '../../../../queries'
 
 // import sendDirectMessage from 'shared/graphql/mutations/message/sendDirectMessage'
 // import { getMessageById } from 'shared/graphql/queries/message/getMessage'
@@ -101,7 +101,7 @@ export const cleanSuggestionUserObject = user => {
 const SuperChatInput = props => {
   const currentUser = useCurrentUser()
   const [sendChannelMessage] = useMutation(CREATE_MESSAGE)
-  const [sendDirectMessage] = useMutation(CREATE_MESSAGE)
+  // const [sendDirectMessage] = useMutation(CREATE_MESSAGE)
 
   const cacheKey = `last-content-${props.channelId}`
   const [text, changeText] = React.useState('')
@@ -155,6 +155,7 @@ const SuperChatInput = props => {
       // If backspace is pressed on the empty
       case 'Backspace': {
         if (text.length === 0) removeAttachments()
+        break
       }
       default:
     }
@@ -239,9 +240,9 @@ const SuperChatInput = props => {
           setMediaPreview(null)
           setAttachedMediaFile(null)
         })
-        .catch(err => {
+        .catch(_ => {
           setIsSendingMediaMessage(false)
-          props.dispatch(addToastWithTimeout('error', err.message))
+          // props.dispatch(addToastWithTimeout('error', err.message))
         })
     }
 
@@ -271,36 +272,38 @@ const SuperChatInput = props => {
   }
 
   // $FlowFixMe
+  // eslint-disable-next-line no-unused-vars
   const [isSendingMediaMessage, setIsSendingMediaMessage] = React.useState(
     false,
   )
+
   // $FlowFixMe
   const [mediaPreview, setMediaPreview] = React.useState(null)
   // $FlowFixMe
   const [mediaFile, setAttachedMediaFile] = React.useState(null)
 
-  const previewMedia = blob => {
-    if (isSendingMediaMessage) return
-    setIsSendingMediaMessage(true)
-    setAttachedMediaFile(blob)
-    inputRef && inputRef.focus()
+  // const previewMedia = blob => {
+  //   if (isSendingMediaMessage) return
+  //   setIsSendingMediaMessage(true)
+  //   setAttachedMediaFile(blob)
+  //   inputRef && inputRef.focus()
 
-    const reader = new FileReader()
-    reader.onload = () => {
-      setMediaPreview(reader.result.toString())
-      setIsSendingMediaMessage(false)
-    }
+  //   const reader = new FileReader()
+  //   reader.onload = () => {
+  //     setMediaPreview(reader.result.toString())
+  //     setIsSendingMediaMessage(false)
+  //   }
 
-    if (blob) {
-      reader.readAsDataURL(blob)
-    }
-  }
+  //   if (blob) {
+  //     reader.readAsDataURL(blob)
+  //   }
+  // }
 
   const removeQuotedMessage = () => {
-    if (props.quotedMessage)
-      props.dispatch(
-        replyToMessage({ threadId: props.threadId, messageId: null }),
-      )
+    // if (props.quotedMessage)
+    //   props.dispatch(
+    //     replyToMessage({ threadId: props.threadId, messageId: null }),
+    //   )
   }
 
   const networkDisabled =
diff --git a/app/components/component-formbuilder/src/components/ComponentProperties.jsx b/app/components/component-formbuilder/src/components/ComponentProperties.jsx
index 88e837b92b..ff375d341d 100644
--- a/app/components/component-formbuilder/src/components/ComponentProperties.jsx
+++ b/app/components/component-formbuilder/src/components/ComponentProperties.jsx
@@ -59,6 +59,7 @@ const ComponentProperties = ({
               onChange={event => {
                 let value = {}
                 if (event.target) {
+                  // eslint-disable-next-line prefer-destructuring
                   value = event.target.value
                 } else {
                   value = event
diff --git a/app/components/component-formbuilder/src/components/FormBuilder.jsx b/app/components/component-formbuilder/src/components/FormBuilder.jsx
index 81eb4d088c..b8b6d20202 100644
--- a/app/components/component-formbuilder/src/components/FormBuilder.jsx
+++ b/app/components/component-formbuilder/src/components/FormBuilder.jsx
@@ -1,11 +1,4 @@
 import React, { useState } from 'react'
-import {
-  compose,
-  withState,
-  withHandlers,
-  lifecycle,
-  // setDisplayName,
-} from 'recompose'
 import styled, { withTheme } from 'styled-components'
 import { unescape } from 'lodash'
 import { th } from '@pubsweet/ui-toolkit'
@@ -141,27 +134,3 @@ const FormBuilder = ({
 }
 
 export default FormBuilder
-// FormBuilder.displayName = 'FormBuilder'
-
-// export default compose(
-// withState('elements', 'onAddElements', ({ form }) => form.children || []),
-// withHandlers({
-//   addElements: ({ onAddElements, form }) => addElement =>
-//     onAddElements(() => {
-//       const addEl = { children: form.children || [] }
-//       addEl.children = [...addEl.children, addElement]
-//       return addEl.children
-//     }),
-// }),
-// lifecycle({
-//   componentWillReceiveProps(nextProps) {
-//     if (this.props.form.children !== nextProps.form.children) {
-//       this.setState({ elements: nextProps.form.children })
-//     }
-
-//     if (this.props.elements !== nextProps.elements) {
-//       this.setState({ elements: nextProps.elements })
-//     }
-//   },
-// }),
-// )(FormBuilder)
diff --git a/app/components/component-formbuilder/src/redux/FormBuilder.js b/app/components/component-formbuilder/src/redux/FormBuilder.js
index edf54a138b..26325d6da7 100644
--- a/app/components/component-formbuilder/src/redux/FormBuilder.js
+++ b/app/components/component-formbuilder/src/redux/FormBuilder.js
@@ -1,135 +1,135 @@
-import * as api from 'pubsweet-client/src/helpers/api'
-
-export const GET_FORM_REQUEST = 'GET_FORM_REQUEST'
-export const GET_FORM_SUCCESS = 'GET_FORM_SUCCESS'
-export const GET_FORM_FAILURE = 'GET_FORM_FAILURE'
-
-function getFormRequest(project, version) {
-  return {
-    type: GET_FORM_REQUEST,
-  }
-}
-
-function getFormSuccess(forms) {
-  return {
-    type: GET_FORM_SUCCESS,
-    forms,
-  }
-}
-
-function getFormFailure(error) {
-  return {
-    type: GET_FORM_FAILURE,
-    error,
-  }
-}
-
-export function getForms() {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .get('/get-forms', {})
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function getForm(formId) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .get(`/get-form/${formId}`, {})
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function updateForms(form, properties) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .update(`/update-forms/${form.id}`, properties)
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function updateElements(form, properties) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .update(
-        `/update-forms/${form.id}/element/${properties.children.id}`,
-        properties,
-      )
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function deleteForms(form) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .remove(`/delete-forms/${form.id}`)
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function deleteElements(form, element) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .remove(`/delete-forms/${form.id}/elements/${element.id}`)
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-export function createForms(properties) {
-  return dispatch => {
-    dispatch(getFormRequest())
-
-    return api
-      .create('/create-forms', properties)
-      .then(result => {
-        dispatch(getFormSuccess(result))
-      })
-      .catch(error => dispatch(getFormFailure(error)))
-  }
-}
-
-const initialState = {}
-export default (state = initialState, action) => {
-  switch (action.type) {
-    case GET_FORM_SUCCESS:
-      return {
-        forms: action.forms.forms,
-      }
-
-    case GET_FORM_FAILURE:
-      return { error: action.error }
-
-    default:
-      return state
-  }
-}
+// import * as api from 'pubsweet-client/src/helpers/api'
+
+// export const GET_FORM_REQUEST = 'GET_FORM_REQUEST'
+// export const GET_FORM_SUCCESS = 'GET_FORM_SUCCESS'
+// export const GET_FORM_FAILURE = 'GET_FORM_FAILURE'
+
+// function getFormRequest(project, version) {
+//   return {
+//     type: GET_FORM_REQUEST,
+//   }
+// }
+
+// function getFormSuccess(forms) {
+//   return {
+//     type: GET_FORM_SUCCESS,
+//     forms,
+//   }
+// }
+
+// function getFormFailure(error) {
+//   return {
+//     type: GET_FORM_FAILURE,
+//     error,
+//   }
+// }
+
+// export function getForms() {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .get('/get-forms', {})
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function getForm(formId) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .get(`/get-form/${formId}`, {})
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function updateForms(form, properties) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .update(`/update-forms/${form.id}`, properties)
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function updateElements(form, properties) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .update(
+//         `/update-forms/${form.id}/element/${properties.children.id}`,
+//         properties,
+//       )
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function deleteForms(form) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .remove(`/delete-forms/${form.id}`)
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function deleteElements(form, element) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .remove(`/delete-forms/${form.id}/elements/${element.id}`)
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// export function createForms(properties) {
+//   return dispatch => {
+//     dispatch(getFormRequest())
+
+//     return api
+//       .create('/create-forms', properties)
+//       .then(result => {
+//         dispatch(getFormSuccess(result))
+//       })
+//       .catch(error => dispatch(getFormFailure(error)))
+//   }
+// }
+
+// const initialState = {}
+// export default (state = initialState, action) => {
+//   switch (action.type) {
+//     case GET_FORM_SUCCESS:
+//       return {
+//         forms: action.forms.forms,
+//       }
+
+//     case GET_FORM_FAILURE:
+//       return { error: action.error }
+
+//     default:
+//       return state
+//   }
+// }
diff --git a/app/components/component-login/src/Login.jsx b/app/components/component-login/src/Login.jsx
index 9fd99f091f..d04d53a279 100644
--- a/app/components/component-login/src/Login.jsx
+++ b/app/components/component-login/src/Login.jsx
@@ -1,13 +1,9 @@
 import React, { useState } from 'react'
 import { Redirect } from 'react-router-dom'
-import PropTypes from 'prop-types'
-import { withFormik } from 'formik'
 import config from 'config'
 import { th, grid, lighten } from '@pubsweet/ui-toolkit'
-import { CenteredColumn, H1, Button } from '@pubsweet/ui'
+import { H1, Button } from '@pubsweet/ui'
 import styled from 'styled-components'
-import { Section } from '../../shared'
-import { Placeholder } from '../../component-chat/src/Messages/style'
 
 const getNextUrl = () => {
   const url = new URL(window.location.href)
@@ -21,26 +17,6 @@ const getNextUrl = () => {
   return `${url.searchParams.get('next') || redirectLink}`
 }
 
-const localStorage = window.localStorage || undefined
-
-const handleSubmit = (values, { props, setSubmitting, setErrors }) =>
-  props
-    .loginUser({ variables: { input: values } })
-    .then(({ data, errors }) => {
-      if (!errors) {
-        localStorage.setItem('token', data.loginUser.token)
-        setTimeout(() => {
-          props.onLoggedIn(getNextUrl())
-        }, 100)
-      }
-    })
-    .catch(e => {
-      if (e.graphQLErrors && e.graphQLErrors.length > 0) {
-        setSubmitting(false)
-        setErrors(e.graphQLErrors[0].message)
-      }
-    })
-
 const getToken = props => {
   const { location } = props
   if (location && location.search && location.search.match(/^\?token=/)) {
@@ -114,18 +90,11 @@ const StyledORCIDIcon = styled(ORCIDIcon)`
 `
 
 const Login = ({ logo = null, ...props }) => {
-  // Is ORCID authentication enabled?
-  const orcid =
-    config['pubsweet-component-login'] &&
-    config['pubsweet-component-login'].orcid
-
   const token = getToken(props)
   // If a JWT token is supplied as a query param (e.g. from OAuth)
   // go ahead and fetch the redirect URL
   const initialRedirectLink = token ? getNextUrl() : null
-  const [redirectLink, setRedirectLink] = useState(initialRedirectLink)
-  // Also set the redirect link upon successful login (via handleSubmit)
-  const onLoggedIn = () => setRedirectLink(getNextUrl())
+  const [redirectLink] = useState(initialRedirectLink)
 
   if (token) {
     window.localStorage.setItem('token', token)
@@ -140,7 +109,7 @@ const Login = ({ logo = null, ...props }) => {
       <Centered>
         <Content>
           {journalName === 'Aperture' && (
-            <img src="/public/logo-aperture.png" />
+            <img alt="Aperture" src="/public/logo-aperture.png" />
           )}
           <H1>Login to {journalName}</H1>
           {journalName} uses ORCID <StyledORCIDIcon /> to identify authors and
diff --git a/app/components/component-profile/src/FormGrid.jsx b/app/components/component-profile/src/FormGrid.jsx
index e9144c8135..6c027ed888 100644
--- a/app/components/component-profile/src/FormGrid.jsx
+++ b/app/components/component-profile/src/FormGrid.jsx
@@ -38,4 +38,3 @@ export const FormRow = styled.div`
     margin-left: calc(${th('gridUnit')} * 2);
   }
 `
-
diff --git a/app/components/component-profile/src/PageWithHeader.jsx b/app/components/component-profile/src/PageWithHeader.jsx
index 28929e72dc..0570a64ea6 100644
--- a/app/components/component-profile/src/PageWithHeader.jsx
+++ b/app/components/component-profile/src/PageWithHeader.jsx
@@ -50,8 +50,8 @@ const PageWithHeader = ({ children, header }) => (
         <Heading>{header}</Heading>
       </HeaderText>
     </StyledHeader>
-    { children }
+    {children}
   </Settings>
 )
 
-export default PageWithHeader
\ No newline at end of file
+export default PageWithHeader
diff --git a/app/components/component-profile/src/Profile.jsx b/app/components/component-profile/src/Profile.jsx
index 5ed55f5b30..a3ee135b84 100644
--- a/app/components/component-profile/src/Profile.jsx
+++ b/app/components/component-profile/src/Profile.jsx
@@ -1,5 +1,5 @@
 import React, { useCallback } from 'react'
-import { Button, Action } from '@pubsweet/ui'
+import { Button } from '@pubsweet/ui'
 // import { th } from '@pubsweet/ui-toolkit'
 // import styled from 'styled-components'
 import gql from 'graphql-tag'
@@ -108,7 +108,7 @@ const Profile = () => {
               <ChangeUsername user={data.currentUser} />
             </div>
           </FormRow>
-            <Button onClick={() => logoutUser()}>Logout</Button>
+          <Button onClick={() => logoutUser()}>Logout</Button>
         </FormGrid>
       </PageWithHeader>
     </>
diff --git a/app/components/component-profile/src/ProfileImage.jsx b/app/components/component-profile/src/ProfileImage.jsx
index fbaa86fdcc..162c43614f 100644
--- a/app/components/component-profile/src/ProfileImage.jsx
+++ b/app/components/component-profile/src/ProfileImage.jsx
@@ -14,4 +14,3 @@ export const SmallProfileImage = styled.img`
   object-fit: cover;
   border-radius: 50%;
 `
-
diff --git a/app/components/component-review/src/components/ReviewersPage.js b/app/components/component-review/src/components/ReviewersPage.js
index c88a873aab..266792ad75 100644
--- a/app/components/component-review/src/components/ReviewersPage.js
+++ b/app/components/component-review/src/components/ReviewersPage.js
@@ -145,12 +145,12 @@ const ReviewersPage = ({ match, history }) => {
       {props => (
         <Reviewers
           {...props}
+          history={history}
           manuscript={manuscript}
           removeReviewer={removeReviewer}
           Reviewer={ReviewerContainer}
           reviewers={reviewers}
           reviewerUsers={users}
-          history={history}
         />
       )}
     </Formik>
diff --git a/app/components/component-submit/src/components/NewSubmissionPage.jsx b/app/components/component-submit/src/components/NewSubmissionPage.jsx
index 2ce2b53f61..922ad7fd02 100644
--- a/app/components/component-submit/src/components/NewSubmissionPage.jsx
+++ b/app/components/component-submit/src/components/NewSubmissionPage.jsx
@@ -1,13 +1,10 @@
 import React from 'react'
-import { useQuery, useMutation, ApolloConsumer } from '@apollo/client'
-// import Authorize from 'pubsweet-client/src/helpers/Authorize'
-
+import { ApolloConsumer } from '@apollo/client'
 import config from 'config'
-import { Container, Content, Section, Heading, UploadContainer, PageHeading } from '../style'
+import { Container, Content, UploadContainer, PageHeading } from '../style'
 import UploadManuscript from './UploadManuscript'
-import { Spinner } from '../../../shared'
-import { Action } from '@pubsweet/ui'
 import useCurrentUser from '../../../../hooks/useCurrentUser'
+
 const { acceptUploadFiles } = config['pubsweet-component-xpub-dashboard'] || {}
 
 const acceptFiles =
@@ -15,7 +12,6 @@ const acceptFiles =
     ? acceptUploadFiles.join()
     : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
 
-
 const Dashboard = props => {
   const currentUser = useCurrentUser()
 
@@ -23,19 +19,18 @@ const Dashboard = props => {
     <Container>
       <PageHeading level={1}>New submission</PageHeading>
       <Content>
-      <UploadContainer>
-        <ApolloConsumer>
-          {client => (
-            <UploadManuscript
-              acceptFiles={acceptFiles}
-              client={client}
-              currentUser={currentUser}
-              history={props.history}
-            />
-          )}
-        </ApolloConsumer>
-      </UploadContainer>
-
+        <UploadContainer>
+          <ApolloConsumer>
+            {client => (
+              <UploadManuscript
+                acceptFiles={acceptFiles}
+                client={client}
+                currentUser={currentUser}
+                history={props.history}
+              />
+            )}
+          </ApolloConsumer>
+        </UploadContainer>
       </Content>
     </Container>
   )
diff --git a/app/components/component-submit/src/upload.js b/app/components/component-submit/src/upload.js
index 99338907f8..2f06bf098e 100644
--- a/app/components/component-submit/src/upload.js
+++ b/app/components/component-submit/src/upload.js
@@ -1,10 +1,6 @@
 import config from 'config'
 import request from 'pubsweet-client/src/helpers/api'
 import gql from 'graphql-tag'
-// TOOD: These queries come from the dashboard component,
-// making this a tricky dependency. Should we extract them into
-// a shared component?
-import queries from '../../component-dashboard/src/graphql/queries'
 
 const generateTitle = name =>
   name
diff --git a/app/components/component-teams-manager/src/components/Team.jsx b/app/components/component-teams-manager/src/components/Team.jsx
index 9a04a9065b..66535822df 100644
--- a/app/components/component-teams-manager/src/components/Team.jsx
+++ b/app/components/component-teams-manager/src/components/Team.jsx
@@ -14,7 +14,8 @@ const Team = ({ team, number, userOptions, deleteTeam, updateTeam }) => (
       {team.name} {team.role}
     </TeamTableCell>
     <TeamTableCell>
-      {team.object && team.object.objectType} {team.object && team.object.objectId}
+      {team.object && team.object.objectType}{' '}
+      {team.object && team.object.objectId}
     </TeamTableCell>
     <TeamTableCell width={40}>
       <StyledMenu
diff --git a/app/components/component-users-manager/src/UsersManager.jsx b/app/components/component-users-manager/src/UsersManager.jsx
index 5a09925c79..72869f557d 100644
--- a/app/components/component-users-manager/src/UsersManager.jsx
+++ b/app/components/component-users-manager/src/UsersManager.jsx
@@ -44,7 +44,6 @@ const GET_USERS = gql`
   }
 `
 
-
 const UsersManager = () => {
   const SortHeader = ({ thisSortName, children }) => {
     const changeSort = () => {
diff --git a/app/components/shared/Pagination.jsx b/app/components/shared/Pagination.jsx
index 8a395f37f8..e5b5aa3b83 100644
--- a/app/components/shared/Pagination.jsx
+++ b/app/components/shared/Pagination.jsx
@@ -144,4 +144,3 @@ export const Pagination = ({ setPage, limit, page, totalCount }) => {
     </PaginationContainer>
   )
 }
-
diff --git a/package.json b/package.json
index 09e45ace09..deb61c584b 100644
--- a/package.json
+++ b/package.json
@@ -113,7 +113,7 @@
     "husky": "^0.14.3",
     "jest-cli": "^22.1.4",
     "joi-browser": "^10.0.6",
-    "lint-staged": "^4.1.3",
+    "lint-staged": "^10.2.11",
     "mini-css-extract-plugin": "^0.8.0",
     "node-dev": "^4.0.0",
     "prettier": "^1.8.2",
@@ -137,7 +137,7 @@
   },
   "scripts": {
     "lint": "npm run lint:js && npm run lint:style",
-    "lint:js": "eslint app/ scripts/ server/ config/",
+    "lint:js": "eslint app/ scripts/ server/ config/ --ext js,jsx",
     "lint:style": "stylelint app/**/*.scss app/**/*.css",
     "precommit": "lint-staged",
     "reset": "pubsweet setupdb --clobber",
diff --git a/yarn.lock b/yarn.lock
index 7f7ed6a8d6..7e8a7f476b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1945,6 +1945,11 @@
     "@types/connect" "*"
     "@types/node" "*"
 
+"@types/color-name@^1.1.1":
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
 "@types/connect@*":
   version "3.4.33"
   resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546"
@@ -2496,16 +2501,23 @@ ansi-colors@^3.0.0:
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
   integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
 
-ansi-escapes@^1.0.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
-  integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
+ansi-colors@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
 
 ansi-escapes@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
+ansi-escapes@^4.3.0:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
+  integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
+  dependencies:
+    type-fest "^0.11.0"
+
 ansi-html@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
@@ -2526,6 +2538,11 @@ ansi-regex@^4.1.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
   integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
 
+ansi-regex@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -2538,6 +2555,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+  dependencies:
+    "@types/color-name" "^1.1.1"
+    color-convert "^2.0.1"
+
 any-base@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
@@ -2827,11 +2852,6 @@ apollo-utilities@1.3.4, apollo-utilities@^1.0.1, apollo-utilities@^1.2.1, apollo
     ts-invariant "^0.4.0"
     tslib "^1.10.0"
 
-app-root-path@^2.0.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a"
-  integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==
-
 append-field@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
@@ -3044,6 +3064,11 @@ astral-regex@^1.0.0:
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
   integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
 
+astral-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
 async-each@^1.0.0, async-each@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
@@ -3858,7 +3883,7 @@ braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@~3.0.2:
+braces@^3.0.1, braces@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
   integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -4258,7 +4283,7 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
+chalk@^1.0.0, chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
   integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
@@ -4269,6 +4294,14 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
+chalk@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+  integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
 change-emitter@^0.1.2:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
@@ -4466,10 +4499,12 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0:
   dependencies:
     restore-cursor "^2.0.0"
 
-cli-spinners@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c"
-  integrity sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=
+cli-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+  integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+  dependencies:
+    restore-cursor "^3.1.0"
 
 cli-table3@0.5.1:
   version "0.5.1"
@@ -4481,6 +4516,14 @@ cli-table3@0.5.1:
   optionalDependencies:
     colors "^1.1.2"
 
+cli-truncate@2.1.0, cli-truncate@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+  integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+  dependencies:
+    slice-ansi "^3.0.0"
+    string-width "^4.2.0"
+
 cli-truncate@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
@@ -4587,12 +4630,19 @@ color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1:
   dependencies:
     color-name "1.1.3"
 
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
 color-name@1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@^1.0.0:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -4685,7 +4735,7 @@ commander@4.1.1:
   resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
   integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
 
-commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.9.0, commander@~2.20.3:
+commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@~2.20.3:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -4918,20 +4968,6 @@ cors@^2.8.4:
     object-assign "^4"
     vary "^1"
 
-cosmiconfig@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37"
-  integrity sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=
-  dependencies:
-    graceful-fs "^4.1.2"
-    js-yaml "^3.4.3"
-    minimist "^1.2.0"
-    object-assign "^4.0.1"
-    os-homedir "^1.0.1"
-    parse-json "^2.2.0"
-    pinkie-promise "^2.0.0"
-    require-from-string "^1.1.0"
-
 cosmiconfig@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397"
@@ -5365,6 +5401,11 @@ decode-uri-component@^0.2.0:
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
   integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
 
+dedent@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+  integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+
 deep-equal@*:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0"
@@ -5832,6 +5873,11 @@ emoji-regex@^7.0.1:
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
   integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
 
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
 emoji-regex@^9.0.0:
   version "9.0.0"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.0.0.tgz#48a2309cc8a1d2e9d23bc6a67c39b63032e76ea4"
@@ -5893,6 +5939,13 @@ enhanced-resolve@^4.1.0, enhanced-resolve@^4.1.1:
     memory-fs "^0.5.0"
     tapable "^1.0.0"
 
+enquirer@^2.3.5:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+  integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+  dependencies:
+    ansi-colors "^4.1.1"
+
 entities@^1.1.1, entities@~1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@@ -6437,18 +6490,20 @@ execa@^0.7.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
-execa@^0.8.0:
-  version "0.8.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
-  integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=
+execa@^4.0.1:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
+  integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==
   dependencies:
-    cross-spawn "^5.0.1"
-    get-stream "^3.0.0"
-    is-stream "^1.1.0"
-    npm-run-path "^2.0.0"
-    p-finally "^1.0.0"
-    signal-exit "^3.0.0"
-    strip-eof "^1.0.0"
+    cross-spawn "^7.0.0"
+    get-stream "^5.0.0"
+    human-signals "^1.1.1"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.0"
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+    strip-final-newline "^2.0.0"
 
 execall@^1.0.0:
   version "1.0.0"
@@ -6766,6 +6821,13 @@ figures@^2.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
+figures@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+  integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
 file-entry-cache@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
@@ -8094,13 +8156,6 @@ imurmurhash@^0.1.4:
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
-indent-string@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
-  integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=
-  dependencies:
-    repeating "^2.0.0"
-
 indent-string@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
@@ -8449,6 +8504,11 @@ is-fullwidth-code-point@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
   integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
 
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
 is-function@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
@@ -8970,11 +9030,6 @@ jest-environment-node@^22.4.1:
     jest-mock "^22.4.3"
     jest-util "^22.4.3"
 
-jest-get-type@^21.2.0:
-  version "21.2.0"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23"
-  integrity sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==
-
 jest-get-type@^22.1.0, jest-get-type@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"
@@ -9135,16 +9190,6 @@ jest-util@^22.4.1, jest-util@^22.4.3:
     mkdirp "^0.5.1"
     source-map "^0.6.0"
 
-jest-validate@^21.1.0:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7"
-  integrity sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==
-  dependencies:
-    chalk "^2.0.1"
-    jest-get-type "^21.2.0"
-    leven "^2.1.0"
-    pretty-format "^21.2.1"
-
 jest-validate@^22.4.4:
   version "22.4.4"
   resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d"
@@ -9209,7 +9254,7 @@ js-tokens@^3.0.2:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
   integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
 
-js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
+js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
   version "3.14.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
   integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
@@ -9656,46 +9701,32 @@ lines-and-columns@^1.1.6:
   resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
   integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
 
-lint-staged@^4.1.3:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-4.3.0.tgz#ed0779ad9a42c0dc62bb3244e522870b41125879"
-  integrity sha512-C/Zxslg0VRbsxwmCu977iIs+QyrmW2cyRCPUV5NDFYOH/jtRFHH8ch7ua2fH0voI/nVC3Tpg7DykfgMZySliKw==
+lint-staged@^10.2.11:
+  version "10.2.11"
+  resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.2.11.tgz#713c80877f2dc8b609b05bc59020234e766c9720"
+  integrity sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==
   dependencies:
-    app-root-path "^2.0.0"
-    chalk "^2.1.0"
-    commander "^2.11.0"
-    cosmiconfig "^1.1.0"
-    execa "^0.8.0"
-    is-glob "^4.0.0"
-    jest-validate "^21.1.0"
-    listr "^0.12.0"
-    lodash "^4.17.4"
-    log-symbols "^2.0.0"
-    minimatch "^3.0.0"
-    npm-which "^3.0.1"
-    p-map "^1.1.1"
-    staged-git-files "0.0.4"
-    stringify-object "^3.2.0"
+    chalk "^4.0.0"
+    cli-truncate "2.1.0"
+    commander "^5.1.0"
+    cosmiconfig "^6.0.0"
+    debug "^4.1.1"
+    dedent "^0.7.0"
+    enquirer "^2.3.5"
+    execa "^4.0.1"
+    listr2 "^2.1.0"
+    log-symbols "^4.0.0"
+    micromatch "^4.0.2"
+    normalize-path "^3.0.0"
+    please-upgrade-node "^3.2.0"
+    string-argv "0.3.1"
+    stringify-object "^3.3.0"
 
 listr-silent-renderer@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
   integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=
 
-listr-update-renderer@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9"
-  integrity sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=
-  dependencies:
-    chalk "^1.1.3"
-    cli-truncate "^0.2.1"
-    elegant-spinner "^1.0.1"
-    figures "^1.7.0"
-    indent-string "^3.0.0"
-    log-symbols "^1.0.2"
-    log-update "^1.0.2"
-    strip-ansi "^3.0.1"
-
 listr-update-renderer@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2"
@@ -9710,16 +9741,6 @@ listr-update-renderer@^0.5.0:
     log-update "^2.3.0"
     strip-ansi "^3.0.1"
 
-listr-verbose-renderer@^0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35"
-  integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=
-  dependencies:
-    chalk "^1.1.3"
-    cli-cursor "^1.0.2"
-    date-fns "^1.27.2"
-    figures "^1.7.0"
-
 listr-verbose-renderer@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db"
@@ -9730,6 +9751,20 @@ listr-verbose-renderer@^0.5.0:
     date-fns "^1.27.2"
     figures "^2.0.0"
 
+listr2@^2.1.0:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/listr2/-/listr2-2.3.3.tgz#ee9f4d95dd325ad1ae89fe7327f2a4f4498224b5"
+  integrity sha512-vU2eiFEzUEaDjgwRJ/n8RB79K2cBcaTw1DigIGHnXGp/BEeQqxGwiM8R17Itit5l2ykrrST11kw2l9vSpCbqUQ==
+  dependencies:
+    chalk "^4.0.0"
+    cli-truncate "^2.1.0"
+    figures "^3.2.0"
+    indent-string "^4.0.0"
+    log-update "^4.0.0"
+    p-map "^4.0.0"
+    rxjs "^6.5.5"
+    through "^2.3.8"
+
 listr@0.14.3:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586"
@@ -9745,28 +9780,6 @@ listr@0.14.3:
     p-map "^2.0.0"
     rxjs "^6.3.3"
 
-listr@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a"
-  integrity sha1-a84sD1YD+klYDqF81qAMwOX6RRo=
-  dependencies:
-    chalk "^1.1.3"
-    cli-truncate "^0.2.1"
-    figures "^1.7.0"
-    indent-string "^2.1.0"
-    is-promise "^2.1.0"
-    is-stream "^1.1.0"
-    listr-silent-renderer "^1.1.1"
-    listr-update-renderer "^0.2.0"
-    listr-verbose-renderer "^0.4.0"
-    log-symbols "^1.0.2"
-    log-update "^1.0.2"
-    ora "^0.2.3"
-    p-map "^1.1.1"
-    rxjs "^5.0.0-beta.11"
-    stream-to-observable "^0.1.0"
-    strip-ansi "^3.0.1"
-
 load-bmfont@^1.3.1, load-bmfont@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
@@ -9997,13 +10010,12 @@ log-symbols@^2.0.0:
   dependencies:
     chalk "^2.0.1"
 
-log-update@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
-  integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=
+log-symbols@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
+  integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
   dependencies:
-    ansi-escapes "^1.0.0"
-    cli-cursor "^1.0.2"
+    chalk "^4.0.0"
 
 log-update@^2.3.0:
   version "2.3.0"
@@ -10014,6 +10026,16 @@ log-update@^2.3.0:
     cli-cursor "^2.0.0"
     wrap-ansi "^3.0.1"
 
+log-update@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
+  integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
+  dependencies:
+    ansi-escapes "^4.3.0"
+    cli-cursor "^3.1.0"
+    slice-ansi "^4.0.0"
+    wrap-ansi "^6.2.0"
+
 loglevel@^1.6.7, loglevel@^1.6.8:
   version "1.6.8"
   resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171"
@@ -10309,6 +10331,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
+micromatch@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+  integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+  dependencies:
+    braces "^3.0.1"
+    picomatch "^2.0.5"
+
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -10384,7 +10414,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
   integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
 
-minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -10904,13 +10934,6 @@ npm-packlist@^1.1.6:
     npm-bundled "^1.0.1"
     npm-normalize-package-bin "^1.0.1"
 
-npm-path@^2.0.2:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64"
-  integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==
-  dependencies:
-    which "^1.2.10"
-
 npm-run-path@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -10925,15 +10948,6 @@ npm-run-path@^4.0.0:
   dependencies:
     path-key "^3.0.0"
 
-npm-which@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa"
-  integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=
-  dependencies:
-    commander "^2.9.0"
-    npm-path "^2.0.2"
-    which "^1.2.10"
-
 npmlog@^4.0.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
@@ -11223,16 +11237,6 @@ optionator@^0.8.1, optionator@^0.8.2:
     type-check "~0.3.2"
     word-wrap "~1.2.3"
 
-ora@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4"
-  integrity sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=
-  dependencies:
-    chalk "^1.1.1"
-    cli-cursor "^1.0.2"
-    cli-spinners "^0.1.2"
-    object-assign "^4.0.1"
-
 orderedmap@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789"
@@ -11250,7 +11254,7 @@ os-browserify@^0.3.0:
   resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
   integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
 
-os-homedir@^1.0.0, os-homedir@^1.0.1:
+os-homedir@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
   integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
@@ -11327,11 +11331,6 @@ p-locate@^4.1.0:
   dependencies:
     p-limit "^2.2.0"
 
-p-map@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-  integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
-
 p-map@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
@@ -11344,6 +11343,13 @@ p-map@^3.0.0:
   dependencies:
     aggregate-error "^3.0.0"
 
+p-map@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-retry@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
@@ -11789,7 +11795,7 @@ phin@^2.9.1:
   resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
   integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
 
-picomatch@^2.0.4, picomatch@^2.2.1:
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
   integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
@@ -11854,6 +11860,13 @@ pkginfo@0.3.x:
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
   integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
 
+please-upgrade-node@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
+  integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==
+  dependencies:
+    semver-compare "^1.0.0"
+
 pluralize@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
@@ -12292,14 +12305,6 @@ pretty-error@^2.0.2:
     renderkid "^2.0.1"
     utila "~0.4"
 
-pretty-format@^21.2.1:
-  version "21.2.1"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36"
-  integrity sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==
-  dependencies:
-    ansi-regex "^3.0.0"
-    ansi-styles "^3.2.0"
-
 pretty-format@^22.4.0, pretty-format@^22.4.3:
   version "22.4.3"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
@@ -13566,11 +13571,6 @@ require-directory@^2.1.1:
   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
   integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
 
-require-from-string@^1.1.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
-  integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=
-
 require-from-string@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
@@ -13667,6 +13667,14 @@ restore-cursor@^2.0.0:
     onetime "^2.0.0"
     signal-exit "^3.0.2"
 
+restore-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+  integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+  dependencies:
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -13746,13 +13754,6 @@ rx-lite@*, rx-lite@^4.0.8:
   resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
   integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
 
-rxjs@^5.0.0-beta.11:
-  version "5.5.12"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
-  integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
-  dependencies:
-    symbol-observable "1.0.1"
-
 rxjs@^6.3.3:
   version "6.5.5"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
@@ -13882,6 +13883,11 @@ selfsigned@^1.10.7:
   dependencies:
     node-forge "0.9.0"
 
+semver-compare@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+  integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
@@ -14089,6 +14095,24 @@ slice-ansi@1.0.0:
   dependencies:
     is-fullwidth-code-point "^2.0.0"
 
+slice-ansi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+  integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
+slice-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -14332,11 +14356,6 @@ stack-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
   integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
 
-staged-git-files@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
-  integrity sha1-15fhtVHKemOd7AI33G60u5vhfTU=
-
 start-server-and-test@^1.10.6:
   version "1.11.2"
   resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.11.2.tgz#9144b7b6f25197148f159f261ae80119afbb17d5"
@@ -14412,11 +14431,6 @@ stream-shift@^1.0.0:
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
-stream-to-observable@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe"
-  integrity sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=
-
 streamifier@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f"
@@ -14432,6 +14446,11 @@ strict-uri-encode@^1.0.0:
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
   integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
 
+string-argv@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
+
 string-length@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
@@ -14474,6 +14493,15 @@ string-width@^3.0.0, string-width@^3.1.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
+string-width@^4.1.0, string-width@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+  integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.0"
+
 string.prototype.matchall@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
@@ -14540,7 +14568,7 @@ stringify-entities@^1.0.1:
     is-alphanumerical "^1.0.0"
     is-hexadecimal "^1.0.0"
 
-stringify-object@^3.2.0:
+stringify-object@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
   integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
@@ -14570,6 +14598,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   dependencies:
     ansi-regex "^4.1.0"
 
+strip-ansi@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+  integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+  dependencies:
+    ansi-regex "^5.0.0"
+
 strip-bom@3.0.0, strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -14781,7 +14816,7 @@ supertest@^3.0.0:
     methods "^1.1.2"
     superagent "^3.8.3"
 
-supports-color@7.1.0:
+supports-color@7.1.0, supports-color@^7.1.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
   integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
@@ -14832,11 +14867,6 @@ svgo@^0.7.0:
     sax "~1.2.1"
     whet.extend "~0.9.9"
 
-symbol-observable@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
-  integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
-
 symbol-observable@^1.0.2, symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
@@ -14962,7 +14992,7 @@ through2@^2.0.0:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-through@2, through@^2.3.6, through@~2.3, through@~2.3.1:
+through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -15204,6 +15234,11 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
+type-fest@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+  integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
 type-is@^1.6.16, type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -16083,7 +16118,7 @@ which-typed-array@^1.1.2:
     has-symbols "^1.0.1"
     is-typed-array "^1.1.3"
 
-which@^1.2.10, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
+which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -16188,6 +16223,15 @@ wrap-ansi@^5.1.0:
     string-width "^3.0.0"
     strip-ansi "^5.0.0"
 
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-- 
GitLab