Преглед на файлове

feat: jwt renew via graphql + users create/authorize UI

Nicolas Giard преди 6 години
родител
ревизия
14e34d4346

+ 49 - 18
client/client-app.js

@@ -7,10 +7,11 @@ import VueSimpleBreakpoints from 'vue-simple-breakpoints'
 import VeeValidate from 'vee-validate'
 import VeeValidate from 'vee-validate'
 import { ApolloClient } from 'apollo-client'
 import { ApolloClient } from 'apollo-client'
 import { createPersistedQueryLink } from 'apollo-link-persisted-queries'
 import { createPersistedQueryLink } from 'apollo-link-persisted-queries'
-// import { BatchHttpLink } from 'apollo-link-batch-http'
-import { split } from 'apollo-link'
-import { createHttpLink } from 'apollo-link-http'
+import { BatchHttpLink } from 'apollo-link-batch-http'
+import { ApolloLink, split } from 'apollo-link'
+// import { createHttpLink } from 'apollo-link-http'
 import { WebSocketLink } from 'apollo-link-ws'
 import { WebSocketLink } from 'apollo-link-ws'
+import { ErrorLink } from 'apollo-link-error'
 import { InMemoryCache } from 'apollo-cache-inmemory'
 import { InMemoryCache } from 'apollo-cache-inmemory'
 import { getMainDefinition } from 'apollo-utilities'
 import { getMainDefinition } from 'apollo-utilities'
 import VueApollo from 'vue-apollo'
 import VueApollo from 'vue-apollo'
@@ -54,24 +55,47 @@ moment.locale(siteConfig.lang)
 const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql'
 const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql'
 const graphQLWSEndpoint = ((window.location.protocol === 'https:') ? 'wss:' : 'ws:') + '//' + window.location.host + '/graphql-subscriptions'
 const graphQLWSEndpoint = ((window.location.protocol === 'https:') ? 'wss:' : 'ws:') + '//' + window.location.host + '/graphql-subscriptions'
 
 
-const graphQLLink = createPersistedQueryLink().concat(
-  createHttpLink({
+const graphQLLink = ApolloLink.from([
+  new ErrorLink(({ graphQLErrors, networkError }) => {
+    if (graphQLErrors) {
+      graphQLErrors.map(({ message, locations, path }) =>
+        console.error(
+          `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
+        )
+      )
+      store.commit('showNotification', {
+        style: 'red',
+        message: `An expected error occured.`,
+        icon: 'warning'
+      })
+    }
+    if (networkError) {
+      console.error(networkError)
+      store.commit('showNotification', {
+        style: 'red',
+        message: `Network Error: ${networkError.message}`,
+        icon: 'error'
+      })
+    }
+  }),
+  createPersistedQueryLink(),
+  new BatchHttpLink({
     includeExtensions: true,
     includeExtensions: true,
     uri: graphQLEndpoint,
     uri: graphQLEndpoint,
     credentials: 'include',
     credentials: 'include',
-    fetch: (uri, options) => {
+    fetch: async (uri, options) => {
       // Strip __typename fields from variables
       // Strip __typename fields from variables
       let body = JSON.parse(options.body)
       let body = JSON.parse(options.body)
-      // body = body.map(bd => {
-      //   return ({
-      //     ...bd,
-      //     variables: JSON.parse(JSON.stringify(bd.variables), (key, value) => { return key === '__typename' ? undefined : value })
-      //   })
-      // })
-      body = {
-        ...body,
-        variables: JSON.parse(JSON.stringify(body.variables), (key, value) => { return key === '__typename' ? undefined : value })
-      }
+      body = body.map(bd => {
+        return ({
+          ...bd,
+          variables: JSON.parse(JSON.stringify(bd.variables), (key, value) => { return key === '__typename' ? undefined : value })
+        })
+      })
+      // body = {
+      //   ...body,
+      //   variables: JSON.parse(JSON.stringify(body.variables), (key, value) => { return key === '__typename' ? undefined : value })
+      // }
       options.body = JSON.stringify(body)
       options.body = JSON.stringify(body)
 
 
       // Inject authentication token
       // Inject authentication token
@@ -80,10 +104,17 @@ const graphQLLink = createPersistedQueryLink().concat(
         options.headers.Authorization = `Bearer ${jwtToken}`
         options.headers.Authorization = `Bearer ${jwtToken}`
       }
       }
 
 
-      return fetch(uri, options)
+      const resp = await fetch(uri, options)
+
+      // Handle renewed JWT
+      const newJWT = resp.headers.get('new-jwt')
+      if (newJWT) {
+        Cookies.set('jwt', newJWT, { expires: 365 })
+      }
+      return resp
     }
     }
   })
   })
-)
+])
 
 
 const graphQLWSLink = new WebSocketLink({
 const graphQLWSLink = new WebSocketLink({
   uri: graphQLWSEndpoint,
   uri: graphQLWSEndpoint,

+ 111 - 99
client/components/admin/admin-groups-edit.vue

@@ -7,109 +7,121 @@
           .admin-header-title
           .admin-header-title
             .headline.blue--text.text--darken-2 Edit Group
             .headline.blue--text.text--darken-2 Edit Group
             .subheading.grey--text {{name}}
             .subheading.grey--text {{name}}
-      v-btn(color='primary', fab, absolute, bottom, right, small, to='/groups'): v-icon arrow_upward
-    v-tabs(v-model='tab', :color='$vuetify.dark ? "primary" : "grey lighten-4"', fixed-tabs, :slider-color='$vuetify.dark ? "white" : "primary"', show-arrows)
-      v-tab(key='properties') Properties
-      v-tab(key='rights') Permissions
-      v-tab(key='users') Users
+          v-spacer
+          v-btn(color='indigo', large, outline, to='/groups')
+            v-icon arrow_back
+          v-dialog(v-model='deleteGroupDialog', max-width='500')
+            v-btn(color='red', large, outline, slot='activator')
+              v-icon(color='red') delete
+            v-card
+              .dialog-header.is-red Delete Group?
+              v-card-text Are you sure you want to delete group #[strong {{ name }}]? All users will be unassigned from this group.
+              v-card-actions
+                v-spacer
+                v-btn(flat, @click='deleteGroupDialog = false') Cancel
+                v-btn(color='red', dark, @click='deleteGroup') Delete
+          v-btn(color='primary', large, depressed, @click='updateGroup')
+            v-icon(left) check
+            span Update Group
+        v-card.mt-3
+          v-tabs(v-model='tab', :color='$vuetify.dark ? "primary" : "grey lighten-4"', fixed-tabs, :slider-color='$vuetify.dark ? "white" : "primary"', show-arrows)
+            v-tab(key='properties') Properties
+            v-tab(key='permissions') Permissions
+            v-tab(key='rules') Page Rules
+            v-tab(key='users') Users
 
 
-      v-tab-item(key='properties', :transition='false', :reverse-transition='false')
-        v-card
-          v-card-text
-            v-text-field(v-model='name', label='Group Name', counter='255', prepend-icon='people')
-          v-card-actions.pa-3
-            v-btn(color='primary', @click='updateGroup')
-              v-icon(left) check
-              | Save Changes
-            .caption.ml-4.grey--text ID: {{group.id}}
-            v-spacer
-            v-dialog(v-model='deleteGroupDialog', max-width='500')
-              v-btn(color='red', flat, @click='', slot='activator')
-                v-icon(left) delete
-                | Delete Group
+            v-tab-item(key='properties', :transition='false', :reverse-transition='false')
               v-card
               v-card
-                .dialog-header.is-red Delete Group?
-                v-card-text Are you sure you want to delete group #[strong {{ name }}]? All users will be unassigned from this group.
-                v-card-actions
-                  v-spacer
-                  v-btn(flat, @click='deleteGroupDialog = false') Cancel
-                  v-btn(color='red', dark, @click='deleteGroup') Delete
+                v-card-text
+                  v-text-field(
+                    outline
+                    background-color='grey lighten-3'
+                    v-model='name'
+                    label='Group Name'
+                    counter='255'
+                    prepend-icon='people'
+                    )
+                  v-divider
+                  .caption.mt-3.grey--text ID: {{group.id}}
 
 
-      v-tab-item(key='rights', :transition='false', :reverse-transition='false')
-        v-card
-          v-card-title.pb-0
-            v-subheader
-              v-icon.mr-2 border_color
-              .subheading Read and Write
-            v-spacer
-            v-btn(flat, outline)
-              v-icon(left) arrow_drop_down
-              | Load Preset
-            v-btn(flat, outline)
-              v-icon(left) vertical_align_bottom
-              | Import Rules
-          .pa-3.pl-4
-            criterias
-          v-divider.my-0
-          v-card-title.pb-0
-            v-subheader
-              v-icon.mr-2 pageview
-              .subheading Read Only
-            v-spacer
-            v-btn(flat, outline)
-              v-icon(left) arrow_drop_down
-              | Load Preset
-            v-btn(flat, outline)
-              v-icon(left) vertical_align_bottom
-              | Import Rules
-          .pa-3.pl-4
-            criterias
-          v-divider.my-0
-          v-card-title.pb-0
-            v-subheader Legend
-          .px-4.pb-4
-            .body-1.px-1.py-2 Any number of rules can be used at the same time. However, some rules requires more processing time than others. Rule types are color-coded as followed:
-            .caption
-              v-icon(color='blue') stop
-              span Fast rules. None or insignificant latency introduced to all page loads.
-            .caption
-              v-icon(color='orange') stop
-              span Medium rules. Some latency added to all page loads.
-            .caption
-              v-icon(color='red') stop
-              span Slow rules. May adds noticeable latency to all page loads. Avoid using in multiple rules.
+            v-tab-item(key='permissions', :transition='false', :reverse-transition='false')
+              v-card
 
 
-      v-tab-item(key='users', :transition='false', :reverse-transition='false')
-        v-card
-          v-card-title.pb-0
-            v-btn(color='primary', @click='searchUserDialog = true')
-              v-icon(left) assignment_ind
-              | Assign User
-          v-data-table(
-            :items='group.users',
-            :headers='headers',
-            :search='search',
-            :pagination.sync='pagination',
-            :rows-per-page-items='[15]'
-            hide-actions
-          )
-            template(slot='items', slot-scope='props')
-              tr(:active='props.selected')
-                td.text-xs-right {{ props.item.id }}
-                td {{ props.item.name }}
-                td {{ props.item.email }}
-                td
-                  v-menu(bottom, right, min-width='200')
-                    v-btn(icon, slot='activator'): v-icon.grey--text.text--darken-1 more_horiz
-                    v-list
-                      v-list-tile(@click='unassignUser(props.item.id)')
-                        v-list-tile-action: v-icon(color='orange') highlight_off
-                        v-list-tile-content
-                          v-list-tile-title Unassign
-            template(slot='no-data')
-              v-alert.ma-3(icon='warning', :value='true', outline) No users to display.
-          .text-xs-center.py-2(v-if='users.length > 15')
-            v-pagination(v-model='pagination.page', :length='pages')
+            v-tab-item(key='rules', :transition='false', :reverse-transition='false')
+              v-card
+                v-card-title.pb-0
+                  v-subheader
+                    v-icon.mr-2 border_color
+                    .subheading Read and Write
+                  v-spacer
+                  v-btn(flat, outline)
+                    v-icon(left) arrow_drop_down
+                    | Load Preset
+                  v-btn(flat, outline)
+                    v-icon(left) vertical_align_bottom
+                    | Import Rules
+                .pa-3.pl-4
+                  criterias
+                v-divider.my-0
+                v-card-title.pb-0
+                  v-subheader
+                    v-icon.mr-2 pageview
+                    .subheading Read Only
+                  v-spacer
+                  v-btn(flat, outline)
+                    v-icon(left) arrow_drop_down
+                    | Load Preset
+                  v-btn(flat, outline)
+                    v-icon(left) vertical_align_bottom
+                    | Import Rules
+                .pa-3.pl-4
+                  criterias
+                v-divider.my-0
+                v-card-title.pb-0
+                  v-subheader Legend
+                .px-4.pb-4
+                  .body-1.px-1.py-2 Any number of rules can be used at the same time. However, some rules requires more processing time than others. Rule types are color-coded as followed:
+                  .caption
+                    v-icon(color='blue') stop
+                    span Fast rules. None or insignificant latency introduced to all page loads.
+                  .caption
+                    v-icon(color='orange') stop
+                    span Medium rules. Some latency added to all page loads.
+                  .caption
+                    v-icon(color='red') stop
+                    span Slow rules. May adds noticeable latency to all page loads. Avoid using in multiple rules.
+
+            v-tab-item(key='users', :transition='false', :reverse-transition='false')
+              v-card
+                v-card-title.pb-0
+                  v-btn(color='primary', @click='searchUserDialog = true')
+                    v-icon(left) assignment_ind
+                    | Assign User
+                v-data-table(
+                  :items='group.users',
+                  :headers='headers',
+                  :search='search',
+                  :pagination.sync='pagination',
+                  :rows-per-page-items='[15]'
+                  hide-actions
+                )
+                  template(slot='items', slot-scope='props')
+                    tr(:active='props.selected')
+                      td.text-xs-right {{ props.item.id }}
+                      td {{ props.item.name }}
+                      td {{ props.item.email }}
+                      td
+                        v-menu(bottom, right, min-width='200')
+                          v-btn(icon, slot='activator'): v-icon.grey--text.text--darken-1 more_horiz
+                          v-list
+                            v-list-tile(@click='unassignUser(props.item.id)')
+                              v-list-tile-action: v-icon(color='orange') highlight_off
+                              v-list-tile-content
+                                v-list-tile-title Unassign
+                  template(slot='no-data')
+                    v-alert.ma-3(icon='warning', :value='true', outline) No users to display.
+                .text-xs-center.py-2(v-if='users.length > 15')
+                  v-pagination(v-model='pagination.page', :length='pages')
 
 
     user-search(v-model='searchUserDialog', @select='assignUser')
     user-search(v-model='searchUserDialog', @select='assignUser')
 </template>
 </template>

+ 115 - 0
client/components/admin/admin-users-authorize.vue

@@ -0,0 +1,115 @@
+<template lang="pug">
+  v-dialog(v-model='isShown', max-width='550')
+    v-card
+      .dialog-header.is-short Authorize Social User
+      v-card-text
+        v-select.md2(
+          :items='providers'
+          item-text='title'
+          item-value='key'
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='business'
+          v-model='provider'
+          label='Provider'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='email'
+          v-model='email'
+          label='Email Address'
+          ref='emailInput'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='person'
+          v-model='name'
+          label='Name'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='title'
+          v-model='jobTitle'
+          label='Job Title'
+          counter='255'
+          hint='Optional'
+          persistent-hint
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='public'
+          v-model='location'
+          label='Location'
+          counter='255'
+          hint='Optional'
+          persistent-hint
+          )
+      v-card-chin
+        v-spacer
+        v-btn(flat, @click='isShown = false') Cancel
+        v-btn(color='primary', @click='authorizeUser') Authorize
+</template>
+
+<script>
+import _ from 'lodash'
+
+import providersQuery from 'gql/admin/users/users-query-strategies.gql'
+
+export default {
+  props: {
+    value: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      providers: [],
+      provider: '',
+      email: '',
+      name: '',
+      jobTitle: '',
+      location: ''
+    }
+  },
+  computed: {
+    isShown: {
+      get() { return this.value },
+      set(val) { this.$emit('input', val) }
+    }
+  },
+  watch: {
+    value(newValue, oldValue) {
+      if (newValue) {
+        this.$nextTick(() => {
+          this.$refs.emailInput.focus()
+        })
+      }
+    }
+  },
+  methods: {
+    async authorizeUser() {
+
+    }
+  },
+  apollo: {
+    providers: {
+      query: providersQuery,
+      fetchPolicy: 'network-only',
+      update: (data) => _.reject(data.authentication.strategies, ['key', 'local']),
+      watchLoading (isLoading) {
+        this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-users-strategies-refresh')
+      }
+    }
+  }
+}
+</script>

+ 105 - 0
client/components/admin/admin-users-create.vue

@@ -0,0 +1,105 @@
+<template lang="pug">
+  v-dialog(v-model='isShown', max-width='550')
+    v-card
+      .dialog-header.is-short New Local User
+      v-card-text
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='email'
+          v-model='email'
+          label='Email Address'
+          ref='emailInput'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='person'
+          v-model='name'
+          label='Name'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='lock'
+          append-icon='casino'
+          v-model='password'
+          label='Password'
+          counter='255'
+          @click:append='generatePwd'
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='title'
+          v-model='jobTitle'
+          label='Job Title'
+          counter='255'
+          hint='Optional'
+          persistent-hint
+          )
+        v-text-field.md2(
+          solo
+          flat
+          background-color='grey lighten-4'
+          prepend-icon='public'
+          v-model='location'
+          label='Location'
+          counter='255'
+          hint='Optional'
+          persistent-hint
+          )
+      v-card-chin
+        v-spacer
+        v-btn(flat, @click='isShown = false') Cancel
+        v-btn(color='primary', @click='createUser') Create
+</template>
+
+<script>
+import uuidv4 from 'uuid/v4'
+
+export default {
+  props: {
+    value: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      email: '',
+      name: '',
+      password: '',
+      jobTitle: '',
+      location: ''
+    }
+  },
+  computed: {
+    isShown: {
+      get() { return this.value },
+      set(val) { this.$emit('input', val) }
+    }
+  },
+  watch: {
+    value(newValue, oldValue) {
+      if (newValue) {
+        this.$nextTick(() => {
+          this.$refs.emailInput.focus()
+        })
+      }
+    }
+  },
+  methods: {
+    async createUser() {
+
+    },
+    generatePwd() {
+      this.password = uuidv4().slice(-12)
+    }
+  }
+}
+</script>

+ 74 - 52
client/components/admin/admin-users.vue

@@ -8,99 +8,97 @@
             .headline.blue--text.text--darken-2 Users
             .headline.blue--text.text--darken-2 Users
             .subheading.grey--text Manage users
             .subheading.grey--text Manage users
           v-spacer
           v-spacer
-          v-btn(outline, color='grey', large)
+          v-btn(outline, color='grey', large, @click='refresh')
             v-icon refresh
             v-icon refresh
-          v-btn(color='primary', large, depressed)
+          v-btn(color='primary', large, depressed, @click='authorizeUser')
             v-icon(left) lock_outline
             v-icon(left) lock_outline
-            span Authorize User
-          v-btn(color='primary', large, depressed)
+            span Authorize Social User
+          v-btn(color='primary', large, depressed, @click='createUser')
             v-icon(left) add
             v-icon(left) add
-            span New User
+            span New Local User
         v-card.mt-3
         v-card.mt-3
           v-data-table(
           v-data-table(
             v-model='selected'
             v-model='selected'
-            :items='items',
+            :items='users',
             :headers='headers',
             :headers='headers',
             :search='search',
             :search='search',
             :pagination.sync='pagination',
             :pagination.sync='pagination',
             :rows-per-page-items='[15]'
             :rows-per-page-items='[15]'
-            select-all,
             hide-actions,
             hide-actions,
             disable-initial-sort
             disable-initial-sort
           )
           )
             template(slot='headers', slot-scope='props')
             template(slot='headers', slot-scope='props')
               tr
               tr
-                th(width='50')
-                th.text-xs-right(
-                  width='80'
-                  :class='[`column sortable`, pagination.descending ? `desc` : `asc`, pagination.sortBy === `id` ? `active` : ``]'
-                  @click='changeSort(`id`)'
-                )
-                  v-icon(small) arrow_upward
-                  | ID
+                //- th(width='50')
                 th.text-xs-left(
                 th.text-xs-left(
                   v-for='header in props.headers'
                   v-for='header in props.headers'
                   :key='header.text'
                   :key='header.text'
                   :width='header.width'
                   :width='header.width'
-                  :class='[`column sortable`, pagination.descending ? `desc` : `asc`, header.value === pagination.sortBy ? `active` : ``]'
+                  :class='[`column`, header.sortable ? `sortable` : ``, pagination.descending ? `desc` : `asc`, header.value === pagination.sortBy ? `active` : ``]'
                   @click='changeSort(header.value)'
                   @click='changeSort(header.value)'
                 )
                 )
                   | {{ header.text }}
                   | {{ header.text }}
-                  v-icon(small) arrow_upward
+                  v-icon(small, v-if='header.sortable') arrow_upward
             template(slot='items', slot-scope='props')
             template(slot='items', slot-scope='props')
               tr(:active='props.selected')
               tr(:active='props.selected')
-                td
+                //- td
                   v-checkbox(hide-details, :input-value='props.selected', color='blue darken-2', @click='props.selected = !props.selected')
                   v-checkbox(hide-details, :input-value='props.selected', color='blue darken-2', @click='props.selected = !props.selected')
                 td.text-xs-right {{ props.item.id }}
                 td.text-xs-right {{ props.item.id }}
+                td: strong {{ props.item.name }}
                 td {{ props.item.email }}
                 td {{ props.item.email }}
-                td {{ props.item.name }}
-                td {{ props.item.provider }}
-                td {{ props.item.createdOn }}
-                td {{ props.item.updatedOn }}
-                td: v-btn(icon): v-icon.grey--text.text--darken-1 more_horiz
+                td {{ props.item.providerKey }}
+                td {{ props.item.createdAt | moment('from') }}
+                td
+                  v-menu(bottom, right, min-width='200')
+                    v-btn(icon, slot='activator'): v-icon.grey--text.text--darken-1 more_horiz
+                    v-list
+                      v-list-tile(@click='')
+                        v-list-tile-action
+                          v-icon(color='primary') edit
+                        v-list-tile-content
+                          v-list-tile-title Edit
+                      v-list-tile(@click='')
+                        v-list-tile-action
+                          v-icon(color='red') block
+                        v-list-tile-content
+                          v-list-tile-title Block
             template(slot='no-data')
             template(slot='no-data')
-              v-alert(icon='warning', :value='true') No users to display!
+              .pa-3
+                v-alert(icon='warning', :value='true', outline) No users to display!
           .text-xs-center.py-2
           .text-xs-center.py-2
             v-pagination(v-model='pagination.page', :length='pages')
             v-pagination(v-model='pagination.page', :length='pages')
+
+    user-authorize(v-model='isAuthorizeDialogShown')
+    user-create(v-model='isCreateDialogShown')
 </template>
 </template>
 
 
 <script>
 <script>
+import usersQuery from 'gql/admin/users/users-query-list.gql'
+
+import UserAuthorize from './admin-users-authorize.vue'
+import UserCreate from './admin-users-create.vue'
+
 export default {
 export default {
+  components: {
+    UserAuthorize,
+    UserCreate
+  },
   data() {
   data() {
     return {
     return {
       selected: [],
       selected: [],
       pagination: {},
       pagination: {},
-      items: [
-        { id: 1, email: 'user@test.com', name: 'John Doe', provider: 'local' },
-        { id: 2, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 3, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 4, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 5, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 6, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 7, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 8, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 9, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 10, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 11, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 12, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 13, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 14, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 15, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 16, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 17, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 18, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 19, email: 'dude@test.com', name: 'John Doe', provider: 'local' },
-        { id: 20, email: 'dude@test.com', name: 'John Doe', provider: 'local' }
-      ],
+      users: [],
       headers: [
       headers: [
-        { text: 'Email', value: 'email' },
-        { text: 'Name', value: 'name' },
-        { text: 'Provider', value: 'provider' },
-        { text: 'Created On', value: 'createdOn' },
-        { text: 'Updated On', value: 'updatedOn' },
+        { text: 'ID', value: 'id', width: 80, sortable: true },
+        { text: 'Name', value: 'name', sortable: true },
+        { text: 'Email', value: 'email', sortable: true },
+        { text: 'Provider', value: 'provider', sortable: true },
+        { text: 'Created', value: 'createdAt', sortable: true },
         { text: '', value: 'actions', sortable: false, width: 50 }
         { text: '', value: 'actions', sortable: false, width: 50 }
       ],
       ],
-      search: ''
+      search: '',
+      isAuthorizeDialogShown: false,
+      isCreateDialogShown: false
     }
     }
   },
   },
   computed: {
   computed: {
@@ -113,6 +111,20 @@ export default {
     }
     }
   },
   },
   methods: {
   methods: {
+    authorizeUser() {
+      this.isAuthorizeDialogShown = true
+    },
+    createUser() {
+      this.isCreateDialogShown = true
+    },
+    async refresh() {
+      await this.$apollo.queries.users.refetch()
+      this.$store.commit('showNotification', {
+        message: 'Users list has been refreshed.',
+        style: 'success',
+        icon: 'cached'
+      })
+    },
     changeSort (column) {
     changeSort (column) {
       if (this.pagination.sortBy === column) {
       if (this.pagination.sortBy === column) {
         this.pagination.descending = !this.pagination.descending
         this.pagination.descending = !this.pagination.descending
@@ -128,6 +140,16 @@ export default {
         this.selected = this.items.slice()
         this.selected = this.items.slice()
       }
       }
     }
     }
+  },
+  apollo: {
+    users: {
+      query: usersQuery,
+      fetchPolicy: 'network-only',
+      update: (data) => data.users.list,
+      watchLoading (isLoading) {
+        this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-users-refresh')
+      }
+    }
   }
   }
 }
 }
 </script>
 </script>

+ 0 - 2
client/graph/admin/users/users-query-list.gql

@@ -5,9 +5,7 @@ query {
       name
       name
       email
       email
       providerKey
       providerKey
-      role
       createdAt
       createdAt
-      updatedAt
     }
     }
   }
   }
 }
 }

+ 12 - 0
client/graph/admin/users/users-query-strategies.gql

@@ -0,0 +1,12 @@
+query {
+  authentication {
+    strategies(
+      isEnabled: true
+    ) {
+      key
+      title
+      icon
+      color
+    }
+  }
+}

+ 29 - 29
package.json

@@ -63,26 +63,26 @@
     "diff2html": "2.4.0",
     "diff2html": "2.4.0",
     "dotize": "^0.2.0",
     "dotize": "^0.2.0",
     "execa": "1.0.0",
     "execa": "1.0.0",
-    "express": "4.16.3",
+    "express": "4.16.4",
     "express-brute": "1.0.1",
     "express-brute": "1.0.1",
     "express-brute-redis": "0.0.1",
     "express-brute-redis": "0.0.1",
     "express-session": "1.15.6",
     "express-session": "1.15.6",
-    "file-type": "9.0.0",
+    "file-type": "10.0.0",
     "filesize.js": "1.0.2",
     "filesize.js": "1.0.2",
-    "follow-redirects": "1.5.8",
+    "follow-redirects": "1.5.9",
     "fs-extra": "7.0.0",
     "fs-extra": "7.0.0",
     "getos": "3.1.0",
     "getos": "3.1.0",
     "graphql": "14.0.2",
     "graphql": "14.0.2",
     "graphql-list-fields": "2.0.2",
     "graphql-list-fields": "2.0.2",
     "graphql-subscriptions": "1.0.0",
     "graphql-subscriptions": "1.0.0",
-    "graphql-tools": "4.0.0",
-    "highlight.js": "9.12.0",
-    "i18next": "11.9.0",
-    "i18next-express-middleware": "1.4.0",
+    "graphql-tools": "4.0.1",
+    "highlight.js": "9.13.0",
+    "i18next": "11.9.1",
+    "i18next-express-middleware": "1.4.1",
     "i18next-localstorage-cache": "1.1.1",
     "i18next-localstorage-cache": "1.1.1",
     "i18next-node-fs-backend": "2.1.0",
     "i18next-node-fs-backend": "2.1.0",
     "image-size": "0.6.3",
     "image-size": "0.6.3",
-    "ioredis": "4.0.0",
+    "ioredis": "4.0.2",
     "js-binary": "1.2.0",
     "js-binary": "1.2.0",
     "js-yaml": "3.12.0",
     "js-yaml": "3.12.0",
     "jsonwebtoken": "8.3.0",
     "jsonwebtoken": "8.3.0",
@@ -107,9 +107,9 @@
     "mime-types": "2.1.20",
     "mime-types": "2.1.20",
     "moment": "2.22.2",
     "moment": "2.22.2",
     "moment-timezone": "0.5.21",
     "moment-timezone": "0.5.21",
-    "mongodb": "3.1.6",
+    "mongodb": "3.1.8",
     "mssql": "4.2.1",
     "mssql": "4.2.1",
-    "multer": "1.4.0",
+    "multer": "1.4.1",
     "mysql2": "1.6.1",
     "mysql2": "1.6.1",
     "node-2fa": "1.1.2",
     "node-2fa": "1.1.2",
     "node-cache": "4.2.0",
     "node-cache": "4.2.0",
@@ -135,9 +135,9 @@
     "passport-slack": "0.0.7",
     "passport-slack": "0.0.7",
     "passport-twitch": "1.0.3",
     "passport-twitch": "1.0.3",
     "passport-windowslive": "1.0.2",
     "passport-windowslive": "1.0.2",
-    "pg": "7.4.3",
+    "pg": "7.5.0",
     "pg-hstore": "2.3.2",
     "pg-hstore": "2.3.2",
-    "pm2": "3.1.3",
+    "pm2": "3.2.2",
     "pug": "2.0.3",
     "pug": "2.0.3",
     "qr-image": "3.2.0",
     "qr-image": "3.2.0",
     "raven": "2.6.4",
     "raven": "2.6.4",
@@ -146,7 +146,7 @@
     "request": "2.88.0",
     "request": "2.88.0",
     "request-promise": "4.2.2",
     "request-promise": "4.2.2",
     "scim-query-filter-parser": "1.1.0",
     "scim-query-filter-parser": "1.1.0",
-    "semver": "5.5.1",
+    "semver": "5.6.0",
     "serve-favicon": "2.5.0",
     "serve-favicon": "2.5.0",
     "sqlite3": "4.0.2",
     "sqlite3": "4.0.2",
     "subscriptions-transport-ws": "0.9.15",
     "subscriptions-transport-ws": "0.9.15",
@@ -172,9 +172,9 @@
     "@babel/polyfill": "^7.0.0",
     "@babel/polyfill": "^7.0.0",
     "@babel/preset-env": "^7.1.0",
     "@babel/preset-env": "^7.1.0",
     "@panter/vue-i18next": "0.13.0",
     "@panter/vue-i18next": "0.13.0",
-    "@vue/cli": "3.0.4",
+    "@vue/cli": "3.0.5",
     "animated-number-vue": "0.1.3",
     "animated-number-vue": "0.1.3",
-    "apollo-cache-inmemory": "1.3.0",
+    "apollo-cache-inmemory": "1.3.5",
     "apollo-client": "2.4.2",
     "apollo-client": "2.4.2",
     "apollo-fetch": "0.7.0",
     "apollo-fetch": "0.7.0",
     "apollo-link": "1.2.3",
     "apollo-link": "1.2.3",
@@ -195,12 +195,12 @@
     "cache-loader": "1.2.2",
     "cache-loader": "1.2.2",
     "chart.js": "2.7.2",
     "chart.js": "2.7.2",
     "clean-webpack-plugin": "0.1.19",
     "clean-webpack-plugin": "0.1.19",
-    "copy-webpack-plugin": "4.5.2",
+    "copy-webpack-plugin": "4.5.3",
     "css-loader": "1.0.0",
     "css-loader": "1.0.0",
     "cssnano": "4.1.4",
     "cssnano": "4.1.4",
     "duplicate-package-checker-webpack-plugin": "3.0.0",
     "duplicate-package-checker-webpack-plugin": "3.0.0",
     "epic-spinners": "1.0.3",
     "epic-spinners": "1.0.3",
-    "eslint": "5.6.1",
+    "eslint": "5.7.0",
     "eslint-config-requarks": "1.0.7",
     "eslint-config-requarks": "1.0.7",
     "eslint-config-standard": "12.0.0",
     "eslint-config-standard": "12.0.0",
     "eslint-plugin-import": "2.14.0",
     "eslint-plugin-import": "2.14.0",
@@ -212,15 +212,15 @@
     "grapesjs": "0.14.33",
     "grapesjs": "0.14.33",
     "graphiql": "0.12.0",
     "graphiql": "0.12.0",
     "graphql-persisted-document-loader": "1.0.1",
     "graphql-persisted-document-loader": "1.0.1",
-    "graphql-tag": "^2.9.2",
-    "graphql-voyager": "1.0.0-rc.25",
+    "graphql-tag": "^2.10.0",
+    "graphql-voyager": "1.0.0-rc.26",
     "hammerjs": "2.0.8",
     "hammerjs": "2.0.8",
     "html-webpack-plugin": "3.2.0",
     "html-webpack-plugin": "3.2.0",
     "html-webpack-pug-plugin": "0.3.0",
     "html-webpack-pug-plugin": "0.3.0",
     "i18next-xhr-backend": "1.5.1",
     "i18next-xhr-backend": "1.5.1",
     "ignore-loader": "0.1.2",
     "ignore-loader": "0.1.2",
     "js-cookie": "2.2.0",
     "js-cookie": "2.2.0",
-    "mini-css-extract-plugin": "0.4.3",
+    "mini-css-extract-plugin": "0.4.4",
     "node-sass": "4.9.3",
     "node-sass": "4.9.3",
     "offline-plugin": "5.0.5",
     "offline-plugin": "5.0.5",
     "optimize-css-assets-webpack-plugin": "5.0.1",
     "optimize-css-assets-webpack-plugin": "5.0.1",
@@ -229,7 +229,7 @@
     "postcss-flexibility": "2.0.0",
     "postcss-flexibility": "2.0.0",
     "postcss-import": "12.0.0",
     "postcss-import": "12.0.0",
     "postcss-loader": "3.0.0",
     "postcss-loader": "3.0.0",
-    "postcss-preset-env": "6.0.7",
+    "postcss-preset-env": "6.1.1",
     "postcss-selector-parser": "5.0.0-rc.3",
     "postcss-selector-parser": "5.0.0-rc.3",
     "pug-lint": "2.5.0",
     "pug-lint": "2.5.0",
     "pug-loader": "2.4.0",
     "pug-loader": "2.4.0",
@@ -242,12 +242,12 @@
     "sass-resources-loader": "1.3.3",
     "sass-resources-loader": "1.3.3",
     "script-ext-html-webpack-plugin": "2.0.1",
     "script-ext-html-webpack-plugin": "2.0.1",
     "simple-progress-webpack-plugin": "1.1.2",
     "simple-progress-webpack-plugin": "1.1.2",
-    "style-loader": "0.23.0",
+    "style-loader": "0.23.1",
     "stylus": "0.54.5",
     "stylus": "0.54.5",
     "stylus-loader": "3.0.2",
     "stylus-loader": "3.0.2",
     "twemoji-awesome": "1.0.6",
     "twemoji-awesome": "1.0.6",
-    "url-loader": "1.1.1",
-    "vee-validate": "2.1.0-beta.9",
+    "url-loader": "1.1.2",
+    "vee-validate": "2.1.0-beta.11",
     "velocity-animate": "1.5.2",
     "velocity-animate": "1.5.2",
     "viz.js": "2.0.0",
     "viz.js": "2.0.0",
     "vue": "2.5.17",
     "vue": "2.5.17",
@@ -257,7 +257,7 @@
     "vue-codemirror": "4.0.5",
     "vue-codemirror": "4.0.5",
     "vue-hot-reload-api": "2.3.1",
     "vue-hot-reload-api": "2.3.1",
     "vue-loader": "15.4.2",
     "vue-loader": "15.4.2",
-    "vue-material-design-icons": "2.1.1",
+    "vue-material-design-icons": "2.3.0",
     "vue-moment": "4.0.0",
     "vue-moment": "4.0.0",
     "vue-router": "3.0.1",
     "vue-router": "3.0.1",
     "vue-simple-breakpoints": "1.0.3",
     "vue-simple-breakpoints": "1.0.3",
@@ -267,7 +267,7 @@
     "vue-tree-navigation": "3.0.1",
     "vue-tree-navigation": "3.0.1",
     "vue2-animate": "2.1.0",
     "vue2-animate": "2.1.0",
     "vuedraggable": "2.16.0",
     "vuedraggable": "2.16.0",
-    "vuetify": "1.2.5",
+    "vuetify": "1.2.9",
     "vuex": "3.0.1",
     "vuex": "3.0.1",
     "vuex-pathify": "1.1.3",
     "vuex-pathify": "1.1.3",
     "vuex-persistedstate": "2.5.4",
     "vuex-persistedstate": "2.5.4",
@@ -275,12 +275,12 @@
     "webpack-bundle-analyzer": "3.0.2",
     "webpack-bundle-analyzer": "3.0.2",
     "webpack-cli": "3.1.2",
     "webpack-cli": "3.1.2",
     "webpack-dev-middleware": "3.4.0",
     "webpack-dev-middleware": "3.4.0",
-    "webpack-hot-middleware": "2.24.2",
+    "webpack-hot-middleware": "2.24.3",
     "webpack-merge": "4.1.4",
     "webpack-merge": "4.1.4",
-    "webpack-subresource-integrity": "1.1.0-rc.6",
+    "webpack-subresource-integrity": "1.2.0",
     "whatwg-fetch": "3.0.0",
     "whatwg-fetch": "3.0.0",
     "write-file-webpack-plugin": "4.4.1",
     "write-file-webpack-plugin": "4.4.1",
-    "xterm": "3.7.0"
+    "xterm": "3.8.0"
   },
   },
   "browserslist": [
   "browserslist": [
     "> 1%",
     "> 1%",

+ 2 - 2
server/graph/resolvers/user.js

@@ -11,14 +11,14 @@ module.exports = {
   UserQuery: {
   UserQuery: {
     async list(obj, args, context, info) {
     async list(obj, args, context, info) {
       return WIKI.models.users.query()
       return WIKI.models.users.query()
-        .select('id', 'email', 'name', 'providerKey', 'role', 'createdAt', 'updatedAt')
+        .select('id', 'email', 'name', 'providerKey', 'createdAt')
     },
     },
     async search(obj, args, context, info) {
     async search(obj, args, context, info) {
       return WIKI.models.users.query()
       return WIKI.models.users.query()
         .where('email', 'like', `%${args.query}%`)
         .where('email', 'like', `%${args.query}%`)
         .orWhere('name', 'like', `%${args.query}%`)
         .orWhere('name', 'like', `%${args.query}%`)
         .limit(10)
         .limit(10)
-        .select('id', 'email', 'name', 'providerKey', 'role', 'createdAt', 'updatedAt')
+        .select('id', 'email', 'name', 'providerKey', 'createdAt')
     },
     },
     async single(obj, args, context, info) {
     async single(obj, args, context, info) {
       let usr = await WIKI.models.users.query().findById(args.id)
       let usr = await WIKI.models.users.query().findById(args.id)

+ 1 - 0
server/graph/schemas/user.graphql

@@ -86,6 +86,7 @@ type UserMinimal {
   name: String!
   name: String!
   email: String!
   email: String!
   providerKey: String!
   providerKey: String!
+  createdAt: Date!
 }
 }
 
 
 type User {
 type User {

+ 1 - 1
server/middlewares/auth.js

@@ -22,7 +22,7 @@ module.exports = {
 
 
           // Try headers, otherwise cookies for response
           // Try headers, otherwise cookies for response
           if (req.get('content-type') === 'application/json') {
           if (req.get('content-type') === 'application/json') {
-            res.headers('new-jwt', newToken.token)
+            res.set('new-jwt', newToken.token)
           } else {
           } else {
             res.cookie('jwt', newToken.token, { expires: moment().add(365, 'days').toDate() })
             res.cookie('jwt', newToken.token, { expires: moment().add(365, 'days').toDate() })
           }
           }

+ 243 - 173
yarn.lock

@@ -917,6 +917,14 @@
   dependencies:
   dependencies:
     deepmerge "^2.0.0"
     deepmerge "^2.0.0"
 
 
+"@pm2/agent-node@^1.0.6":
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/@pm2/agent-node/-/agent-node-1.0.6.tgz#e1e0974ec5fc0112faf795492012b4fe3a25765b"
+  dependencies:
+    debug "^3.1.0"
+    eventemitter2 "^5.0.1"
+    ws "^6.0.0"
+
 "@pm2/agent@^0.5.11":
 "@pm2/agent@^0.5.11":
   version "0.5.13"
   version "0.5.13"
   resolved "https://registry.yarnpkg.com/@pm2/agent/-/agent-0.5.13.tgz#e3778413a01ace791527d66b50ff8c3b7b87bcdc"
   resolved "https://registry.yarnpkg.com/@pm2/agent/-/agent-0.5.13.tgz#e3778413a01ace791527d66b50ff8c3b7b87bcdc"
@@ -932,10 +940,11 @@
     semver "^5.5.0"
     semver "^5.5.0"
     ws "^5.1.0"
     ws "^5.1.0"
 
 
-"@pm2/io@~2.3.11":
-  version "2.3.11"
-  resolved "https://registry.yarnpkg.com/@pm2/io/-/io-2.3.11.tgz#f9b14b8acc9af816dcbeee6c2d027eb89355d8d1"
+"@pm2/io@~2.4.2":
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/@pm2/io/-/io-2.4.5.tgz#17971da22ff716ded4a3db5e0372daf5c1e2f851"
   dependencies:
   dependencies:
+    "@pm2/agent-node" "^1.0.6"
     async "^2.6.1"
     async "^2.6.1"
     debug "3.1.0"
     debug "3.1.0"
     deep-metrics "0.0.2"
     deep-metrics "0.0.2"
@@ -1161,9 +1170,9 @@
   version "0.8.0"
   version "0.8.0"
   resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
   resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
 
 
-"@vue/cli-shared-utils@^3.0.4":
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.0.4.tgz#055a6eec7dd5d0392bec1547a0199ccc008ccc06"
+"@vue/cli-shared-utils@^3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.0.5.tgz#6fd4772c0eca9f529c4b941b3b721a3aae1d7b8e"
   dependencies:
   dependencies:
     chalk "^2.4.1"
     chalk "^2.4.1"
     execa "^0.10.0"
     execa "^0.10.0"
@@ -1178,16 +1187,16 @@
     semver "^5.5.0"
     semver "^5.5.0"
     string.prototype.padstart "^3.0.0"
     string.prototype.padstart "^3.0.0"
 
 
-"@vue/cli-ui-addon-webpack@^3.0.4":
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli-ui-addon-webpack/-/cli-ui-addon-webpack-3.0.4.tgz#b5fb2115922f4b1619e473fdd4ce2d225cd83b31"
+"@vue/cli-ui-addon-webpack@^3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@vue/cli-ui-addon-webpack/-/cli-ui-addon-webpack-3.0.5.tgz#b8c9096ba04574c3a42abf32403c48070abbcff5"
 
 
-"@vue/cli-ui@^3.0.4":
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli-ui/-/cli-ui-3.0.4.tgz#4c3db7ea9ccdaca1f24b1cc41075c42d0207b45e"
+"@vue/cli-ui@^3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@vue/cli-ui/-/cli-ui-3.0.5.tgz#375bdb0b82c06567d9f7543c25cd78146910f977"
   dependencies:
   dependencies:
     "@akryum/winattr" "^3.0.0"
     "@akryum/winattr" "^3.0.0"
-    "@vue/cli-shared-utils" "^3.0.4"
+    "@vue/cli-shared-utils" "^3.0.5"
     chalk "^2.4.1"
     chalk "^2.4.1"
     clone "^2.1.1"
     clone "^2.1.1"
     deepmerge "^2.1.1"
     deepmerge "^2.1.1"
@@ -1213,13 +1222,13 @@
     vue-cli-plugin-apollo "^0.16.6"
     vue-cli-plugin-apollo "^0.16.6"
     watch "^1.0.2"
     watch "^1.0.2"
 
 
-"@vue/cli@3.0.4":
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli/-/cli-3.0.4.tgz#3236214b97520654f37f365f3860cea712413a6b"
+"@vue/cli@3.0.5":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@vue/cli/-/cli-3.0.5.tgz#40e0ab7b7ea0c123ad8e43440fb29d02c0dc5787"
   dependencies:
   dependencies:
-    "@vue/cli-shared-utils" "^3.0.4"
-    "@vue/cli-ui" "^3.0.4"
-    "@vue/cli-ui-addon-webpack" "^3.0.4"
+    "@vue/cli-shared-utils" "^3.0.5"
+    "@vue/cli-ui" "^3.0.5"
+    "@vue/cli-ui-addon-webpack" "^3.0.5"
     chalk "^2.4.1"
     chalk "^2.4.1"
     cmd-shim "^2.0.2"
     cmd-shim "^2.0.2"
     commander "^2.16.0"
     commander "^2.16.0"
@@ -1476,7 +1485,7 @@ ajv-errors@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59"
 
 
-ajv-keywords@^3.0.0, ajv-keywords@^3.1.0:
+ajv-keywords@^3.1.0:
   version "3.2.0"
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
 
 
@@ -1489,15 +1498,6 @@ ajv@^5.1.0, ajv@^5.3.0:
     fast-json-stable-stringify "^2.0.0"
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.3.0"
     json-schema-traverse "^0.3.0"
 
 
-ajv@^6.0.1:
-  version "6.5.1"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d"
-  dependencies:
-    fast-deep-equal "^2.0.1"
-    fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.4.1"
-    uri-js "^4.2.1"
-
 ajv@^6.1.0, ajv@^6.1.1:
 ajv@^6.1.0, ajv@^6.1.1:
   version "6.5.0"
   version "6.5.0"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.0.tgz#4c8affdf80887d8f132c9c52ab8a2dc4d0b7b24c"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.0.tgz#4c8affdf80887d8f132c9c52ab8a2dc4d0b7b24c"
@@ -1611,7 +1611,15 @@ apollo-cache-control@^0.2.5:
     apollo-server-env "^2.0.3"
     apollo-server-env "^2.0.3"
     graphql-extensions "^0.2.1"
     graphql-extensions "^0.2.1"
 
 
-apollo-cache-inmemory@1.3.0, apollo-cache-inmemory@^1.2.10:
+apollo-cache-inmemory@1.3.5:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.5.tgz#7628ee598271cfffa611e15a7ce67652a84b07b0"
+  dependencies:
+    apollo-cache "^1.1.17"
+    apollo-utilities "^1.0.21"
+    optimism "^0.6.6"
+
+apollo-cache-inmemory@^1.2.10:
   version "1.3.0"
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.0.tgz#3bbadeea01a84c7d67f49872c87912a06f1678df"
   resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.0.tgz#3bbadeea01a84c7d67f49872c87912a06f1678df"
   dependencies:
   dependencies:
@@ -2581,13 +2589,13 @@ browserslist@^4.1.0:
     electron-to-chromium "^1.3.61"
     electron-to-chromium "^1.3.61"
     node-releases "^1.0.0-alpha.11"
     node-releases "^1.0.0-alpha.11"
 
 
-browserslist@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6"
+browserslist@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.2.1.tgz#257a24c879d1cd4016348eee5c25de683260b21d"
   dependencies:
   dependencies:
-    caniuse-lite "^1.0.30000884"
-    electron-to-chromium "^1.3.62"
-    node-releases "^1.0.0-alpha.11"
+    caniuse-lite "^1.0.30000890"
+    electron-to-chromium "^1.3.79"
+    node-releases "^1.0.0-alpha.14"
 
 
 bson@^1.1.0:
 bson@^1.1.0:
   version "1.1.0"
   version "1.1.0"
@@ -2822,9 +2830,9 @@ caniuse-lite@^1.0.30000884:
   version "1.0.30000885"
   version "1.0.30000885"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984"
 
 
-caniuse-lite@^1.0.30000887:
-  version "1.0.30000888"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz#22edb50d91dd70612b5898e3b36f460600c6492f"
+caniuse-lite@^1.0.30000890:
+  version "1.0.30000890"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000890.tgz#86a18ffcc65d79ec6a437e985761b8bf1c4efeaf"
 
 
 capture-stack-trace@^1.0.0:
 capture-stack-trace@^1.0.0:
   version "1.0.0"
   version "1.0.0"
@@ -3468,9 +3476,9 @@ copy-descriptor@^0.1.0:
   version "0.1.1"
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
 
 
-copy-webpack-plugin@4.5.2:
-  version "4.5.2"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c"
+copy-webpack-plugin@4.5.3:
+  version "4.5.3"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.3.tgz#14a224d205e46f7a79f7956028e1da6df2225ff2"
   dependencies:
   dependencies:
     cacache "^10.0.4"
     cacache "^10.0.4"
     find-cache-dir "^1.0.0"
     find-cache-dir "^1.0.0"
@@ -3947,6 +3955,10 @@ data-urls@^1.0.0:
     whatwg-mimetype "^2.0.0"
     whatwg-mimetype "^2.0.0"
     whatwg-url "^6.4.0"
     whatwg-url "^6.4.0"
 
 
+date-fns@^1.29.0:
+  version "1.29.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6"
+
 date-now@^0.1.4:
 date-now@^0.1.4:
   version "0.1.4"
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
@@ -4403,9 +4415,9 @@ electron-to-chromium@^1.3.61:
   version "1.3.62"
   version "1.3.62"
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz#2e8e2dc070c800ec8ce23ff9dfcceb585d6f9ed8"
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz#2e8e2dc070c800ec8ce23ff9dfcceb585d6f9ed8"
 
 
-electron-to-chromium@^1.3.62:
-  version "1.3.72"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.72.tgz#b69683081d5b7eee6e1ea07b2f5fa30b3c72252d"
+electron-to-chromium@^1.3.79:
+  version "1.3.79"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.79.tgz#774718f06284a4bf8f578ac67e74508fe659f13a"
 
 
 elliptic@^6.0.0:
 elliptic@^6.0.0:
   version "6.4.0"
   version "6.4.0"
@@ -4646,9 +4658,9 @@ eslint-visitor-keys@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
 
 
-eslint@5.6.1:
-  version "5.6.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.1.tgz#348134e32ccc09abb2df1bf282b3f6eed8c7b480"
+eslint@5.7.0:
+  version "5.7.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.7.0.tgz#55c326d6fb2ad45fcbd0ce17c3846f025d1d819c"
   dependencies:
   dependencies:
     "@babel/code-frame" "^7.0.0"
     "@babel/code-frame" "^7.0.0"
     ajv "^6.5.3"
     ajv "^6.5.3"
@@ -4681,12 +4693,12 @@ eslint@5.6.1:
     path-is-inside "^1.0.2"
     path-is-inside "^1.0.2"
     pluralize "^7.0.0"
     pluralize "^7.0.0"
     progress "^2.0.0"
     progress "^2.0.0"
-    regexpp "^2.0.0"
+    regexpp "^2.0.1"
     require-uncached "^1.0.3"
     require-uncached "^1.0.3"
     semver "^5.5.1"
     semver "^5.5.1"
     strip-ansi "^4.0.0"
     strip-ansi "^4.0.0"
     strip-json-comments "^2.0.1"
     strip-json-comments "^2.0.1"
-    table "^4.0.3"
+    table "^5.0.2"
     text-table "^0.2.0"
     text-table "^0.2.0"
 
 
 esm@^3.0.84:
 esm@^3.0.84:
@@ -4886,7 +4898,42 @@ express-session@1.15.6:
     uid-safe "~2.1.5"
     uid-safe "~2.1.5"
     utils-merge "1.0.1"
     utils-merge "1.0.1"
 
 
-express@4.16.3, express@^4.0.0, express@^4.16.3:
+express@4.16.4:
+  version "4.16.4"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
+  dependencies:
+    accepts "~1.3.5"
+    array-flatten "1.1.1"
+    body-parser "1.18.3"
+    content-disposition "0.5.2"
+    content-type "~1.0.4"
+    cookie "0.3.1"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "~1.1.2"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "1.1.1"
+    fresh "0.5.2"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.4"
+    qs "6.5.2"
+    range-parser "~1.2.0"
+    safe-buffer "5.1.2"
+    send "0.16.2"
+    serve-static "1.13.2"
+    setprototypeof "1.1.0"
+    statuses "~1.4.0"
+    type-is "~1.6.16"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
+express@^4.0.0, express@^4.16.3:
   version "4.16.3"
   version "4.16.3"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
   dependencies:
   dependencies:
@@ -5074,9 +5121,9 @@ file-loader@2.0.0:
     loader-utils "^1.0.2"
     loader-utils "^1.0.2"
     schema-utils "^1.0.0"
     schema-utils "^1.0.0"
 
 
-file-type@9.0.0:
-  version "9.0.0"
-  resolved "https://registry.yarnpkg.com/file-type/-/file-type-9.0.0.tgz#a68d5ad07f486414dfb2c8866f73161946714a18"
+file-type@10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.0.0.tgz#084f32ab827238aa9a1482195ca7448c77a006b3"
 
 
 file-type@^3.8.0:
 file-type@^3.8.0:
   version "3.9.0"
   version "3.9.0"
@@ -5213,9 +5260,9 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.1"
     inherits "^2.0.1"
     readable-stream "^2.0.4"
     readable-stream "^2.0.4"
 
 
-follow-redirects@1.5.8:
-  version "1.5.8"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1"
+follow-redirects@1.5.9:
+  version "1.5.9"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6"
   dependencies:
   dependencies:
     debug "=3.1.0"
     debug "=3.1.0"
 
 
@@ -5735,9 +5782,13 @@ graphql-tag@^2.0.0, graphql-tag@^2.4.2, graphql-tag@^2.9.2:
   version "2.9.2"
   version "2.9.2"
   resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.9.2.tgz#2f60a5a981375f430bf1e6e95992427dc18af686"
   resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.9.2.tgz#2f60a5a981375f430bf1e6e95992427dc18af686"
 
 
-graphql-tools@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.0.tgz#6ea01937c6f947212f83567ba687e97c22fdd2a6"
+graphql-tag@^2.10.0:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae"
+
+graphql-tools@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.1.tgz#c995a4e25c2967d108c975e508322d12969c8c0e"
   dependencies:
   dependencies:
     apollo-link "^1.2.3"
     apollo-link "^1.2.3"
     apollo-utilities "^1.0.1"
     apollo-utilities "^1.0.1"
@@ -5759,9 +5810,9 @@ graphql-type-json@^0.2.1:
   version "0.2.1"
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.2.1.tgz#d2c177e2f1b17d87f81072cd05311c0754baa420"
   resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.2.1.tgz#d2c177e2f1b17d87f81072cd05311c0754baa420"
 
 
-graphql-voyager@1.0.0-rc.25:
-  version "1.0.0-rc.25"
-  resolved "https://registry.yarnpkg.com/graphql-voyager/-/graphql-voyager-1.0.0-rc.25.tgz#1617138ebb9c79e6467efa13166d8fda20e2eda6"
+graphql-voyager@1.0.0-rc.26:
+  version "1.0.0-rc.26"
+  resolved "https://registry.yarnpkg.com/graphql-voyager/-/graphql-voyager-1.0.0-rc.26.tgz#8655eef611c63b7e0effc07f8d76040e823038ed"
   dependencies:
   dependencies:
     "@f/animate" "^1.0.1"
     "@f/animate" "^1.0.1"
     "@material-ui/core" "^3.0.2"
     "@material-ui/core" "^3.0.2"
@@ -5772,9 +5823,9 @@ graphql-voyager@1.0.0-rc.25:
     prop-types "^15.6.2"
     prop-types "^15.6.2"
     react-redux "^5.0.7"
     react-redux "^5.0.7"
     redux "^4.0.0"
     redux "^4.0.0"
-    redux-thunk "^2.3.0"
-    reselect "^3.0.1"
+    reselect "^4.0.0"
     svg-pan-zoom "^3.5.2"
     svg-pan-zoom "^3.5.2"
+    viz.js "2.0.0"
 
 
 graphql@14.0.2:
 graphql@14.0.2:
   version "14.0.2"
   version "14.0.2"
@@ -5921,9 +5972,9 @@ hex-color-regex@^1.1.0:
   version "1.1.0"
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
   resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
 
 
-highlight.js@9.12.0:
-  version "9.12.0"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
+highlight.js@9.13.0:
+  version "9.13.0"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.0.tgz#ee96d5c5f4c456e440f2dbdb2752211dff56f671"
 
 
 hmac-drbg@^1.0.0:
 hmac-drbg@^1.0.0:
   version "1.0.1"
   version "1.0.1"
@@ -6070,9 +6121,9 @@ hyphenate-style-name@^1.0.2:
   version "1.0.2"
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
   resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
 
 
-i18next-express-middleware@1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/i18next-express-middleware/-/i18next-express-middleware-1.4.0.tgz#442956c3ad54d85be61dcbfcca5b0dcb52584036"
+i18next-express-middleware@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/i18next-express-middleware/-/i18next-express-middleware-1.4.1.tgz#273c4a490ad688ce246815ce1288689c63fa7de1"
   dependencies:
   dependencies:
     cookies "0.7.1"
     cookies "0.7.1"
 
 
@@ -6091,9 +6142,9 @@ i18next-xhr-backend@1.5.1:
   version "1.5.1"
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/i18next-xhr-backend/-/i18next-xhr-backend-1.5.1.tgz#50282610780c6a696d880dfa7f4ac1d01e8c3ad5"
   resolved "https://registry.yarnpkg.com/i18next-xhr-backend/-/i18next-xhr-backend-1.5.1.tgz#50282610780c6a696d880dfa7f4ac1d01e8c3ad5"
 
 
-i18next@11.9.0:
-  version "11.9.0"
-  resolved "https://registry.yarnpkg.com/i18next/-/i18next-11.9.0.tgz#c30c0a5e0a857124923a8dd1ce8f1df603e30c70"
+i18next@11.9.1:
+  version "11.9.1"
+  resolved "https://registry.yarnpkg.com/i18next/-/i18next-11.9.1.tgz#f2718b11da2460e29e2dbd3dd8dea05dfc88e2dc"
 
 
 iconv-lite@0.4.19:
 iconv-lite@0.4.19:
   version "0.4.19"
   version "0.4.19"
@@ -6293,17 +6344,14 @@ invert-kv@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
 
 
-ioredis@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.0.0.tgz#fabf1cf8724f14fd0885233cf2f4fbc6e1e59da2"
+ioredis@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.0.2.tgz#4de98677615f182d38071414f8b2bbad2740f583"
   dependencies:
   dependencies:
     cluster-key-slot "^1.0.6"
     cluster-key-slot "^1.0.6"
     debug "^3.1.0"
     debug "^3.1.0"
     denque "^1.1.0"
     denque "^1.1.0"
     flexbuffer "0.0.6"
     flexbuffer "0.0.6"
-    lodash.bind "^4.2.1"
-    lodash.clone "^4.5.0"
-    lodash.clonedeep "^4.5.0"
     lodash.defaults "^4.2.0"
     lodash.defaults "^4.2.0"
     lodash.difference "^4.5.0"
     lodash.difference "^4.5.0"
     lodash.flatten "^4.4.0"
     lodash.flatten "^4.4.0"
@@ -6314,7 +6362,7 @@ ioredis@4.0.0:
     lodash.sample "^4.2.1"
     lodash.sample "^4.2.1"
     lodash.shuffle "^4.2.0"
     lodash.shuffle "^4.2.0"
     lodash.values "^4.3.0"
     lodash.values "^4.3.0"
-    redis-commands "^1.2.0"
+    redis-commands "^1.3.5"
     redis-errors "^1.2.0"
     redis-errors "^1.2.0"
     redis-parser "^3.0.0"
     redis-parser "^3.0.0"
     standard-as-callback "^1.0.0"
     standard-as-callback "^1.0.0"
@@ -6351,6 +6399,10 @@ ipaddr.js@1.6.0:
   version "1.6.0"
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
 
 
+ipaddr.js@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
+
 is-absolute-url@^2.0.0:
 is-absolute-url@^2.0.0:
   version "2.1.0"
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
@@ -7883,9 +7935,9 @@ mimic-fn@^1.0.0:
   version "1.2.0"
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
 
 
-mini-css-extract-plugin@0.4.3:
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8"
+mini-css-extract-plugin@0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d"
   dependencies:
   dependencies:
     loader-utils "^1.1.0"
     loader-utils "^1.1.0"
     schema-utils "^1.0.0"
     schema-utils "^1.0.0"
@@ -7981,9 +8033,9 @@ moment@2.22.2, "moment@>= 2.9.0", moment@^2.10.2, moment@^2.10.6, moment@^2.11.1
   version "2.22.2"
   version "2.22.2"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
 
 
-mongodb-core@3.1.5:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.5.tgz#59ca67d7f6cea570d5437624a7afec8d752d477a"
+mongodb-core@3.1.7:
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.7.tgz#fe61853a6a6acbd2046c91794e5325ecad85428a"
   dependencies:
   dependencies:
     bson "^1.1.0"
     bson "^1.1.0"
     require_optional "^1.0.1"
     require_optional "^1.0.1"
@@ -7991,11 +8043,11 @@ mongodb-core@3.1.5:
   optionalDependencies:
   optionalDependencies:
     saslprep "^1.0.0"
     saslprep "^1.0.0"
 
 
-mongodb@3.1.6:
-  version "3.1.6"
-  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.1.6.tgz#6054641973b5bf5b5ae1c67dcbcf8fa88280273d"
+mongodb@3.1.8:
+  version "3.1.8"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.1.8.tgz#df8084fda2efdbaddd05dfd6a269891fc4cc72df"
   dependencies:
   dependencies:
-    mongodb-core "3.1.5"
+    mongodb-core "3.1.7"
     safe-buffer "^5.1.2"
     safe-buffer "^5.1.2"
 
 
 move-concurrently@^1.0.1:
 move-concurrently@^1.0.1:
@@ -8025,9 +8077,9 @@ mssql@4.2.1:
     generic-pool "^3.4.2"
     generic-pool "^3.4.2"
     tedious "^2.6.4"
     tedious "^2.6.4"
 
 
-multer@1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.0.tgz#c951616c3f97a709b6294acec3a9952a10d33159"
+multer@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.1.tgz#24b12a416a22fec2ade810539184bf138720159e"
   dependencies:
   dependencies:
     append-field "^1.0.0"
     append-field "^1.0.0"
     busboy "^0.2.11"
     busboy "^0.2.11"
@@ -8275,6 +8327,12 @@ node-releases@^1.0.0-alpha.11:
   dependencies:
   dependencies:
     semver "^5.3.0"
     semver "^5.3.0"
 
 
+node-releases@^1.0.0-alpha.14:
+  version "1.0.0-alpha.14"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.14.tgz#da9e2780add4bbb59ad890af9e2018a1d9c0034b"
+  dependencies:
+    semver "^5.3.0"
+
 node-sass@4.9.3:
 node-sass@4.9.3:
   version "4.9.3"
   version "4.9.3"
   resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224"
   resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224"
@@ -9115,9 +9173,9 @@ pg-types@~1.12.1:
     postgres-date "~1.0.0"
     postgres-date "~1.0.0"
     postgres-interval "^1.1.0"
     postgres-interval "^1.1.0"
 
 
-pg@7.4.3:
-  version "7.4.3"
-  resolved "https://registry.yarnpkg.com/pg/-/pg-7.4.3.tgz#f7b6f93f5340ecc2596afbb94a13e3d6b609834b"
+pg@7.5.0:
+  version "7.5.0"
+  resolved "https://registry.yarnpkg.com/pg/-/pg-7.5.0.tgz#c2853bef2fcb91424ba2f649fd951ce866a84760"
   dependencies:
   dependencies:
     buffer-writer "1.0.1"
     buffer-writer "1.0.1"
     packet-reader "0.3.1"
     packet-reader "0.3.1"
@@ -9230,12 +9288,12 @@ pm2-multimeter@^0.1.2:
   dependencies:
   dependencies:
     charm "~0.1.1"
     charm "~0.1.1"
 
 
-pm2@3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/pm2/-/pm2-3.1.3.tgz#a9ba247e3b34bab3bc7c6fcdfd04a49955c90874"
+pm2@3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/pm2/-/pm2-3.2.2.tgz#ddde90397d6054feb92a51230c3ae0f1e3d9f2c1"
   dependencies:
   dependencies:
     "@pm2/agent" "^0.5.11"
     "@pm2/agent" "^0.5.11"
-    "@pm2/io" "~2.3.11"
+    "@pm2/io" "~2.4.2"
     "@pm2/js-api" "^0.5.15"
     "@pm2/js-api" "^0.5.15"
     async "^2.6.1"
     async "^2.6.1"
     blessed "^0.1.81"
     blessed "^0.1.81"
@@ -9244,6 +9302,7 @@ pm2@3.1.3:
     cli-table-redemption "^1.0.0"
     cli-table-redemption "^1.0.0"
     commander "2.15.1"
     commander "2.15.1"
     cron "^1.3"
     cron "^1.3"
+    date-fns "^1.29.0"
     debug "^3.1"
     debug "^3.1"
     eventemitter2 "5.0.1"
     eventemitter2 "5.0.1"
     fclone "1.0.11"
     fclone "1.0.11"
@@ -9356,6 +9415,14 @@ postcss-color-gray@^4.0.0:
     postcss-message-helpers "^2.0.0"
     postcss-message-helpers "^2.0.0"
     reduce-function-call "^1.0.2"
     reduce-function-call "^1.0.2"
 
 
+postcss-color-gray@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547"
+  dependencies:
+    "@csstools/convert-colors" "^1.4.0"
+    postcss "^7.0.5"
+    postcss-values-parser "^2.0.0"
+
 postcss-color-hex-alpha@^3.0.0:
 postcss-color-hex-alpha@^3.0.0:
   version "3.0.0"
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz#1e53e6c8acb237955e8fd08b7ecdb1b8b8309f95"
   resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-3.0.0.tgz#1e53e6c8acb237955e8fd08b7ecdb1b8b8309f95"
@@ -9501,11 +9568,11 @@ postcss-custom-media@^6.0.0:
   dependencies:
   dependencies:
     postcss "^6.0.1"
     postcss "^6.0.1"
 
 
-postcss-custom-media@^7.0.4:
-  version "7.0.4"
-  resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.4.tgz#98e593c4a9a38fefee848434131fa16d316ee165"
+postcss-custom-media@^7.0.6:
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.6.tgz#c6b00ff7fee6ddc7dfdd946d66ed65e7743db09b"
   dependencies:
   dependencies:
-    postcss "^7.0.2"
+    postcss "^7.0.5"
 
 
 postcss-custom-properties@^6.1.0:
 postcss-custom-properties@^6.1.0:
   version "6.3.1"
   version "6.3.1"
@@ -9514,11 +9581,11 @@ postcss-custom-properties@^6.1.0:
     balanced-match "^1.0.0"
     balanced-match "^1.0.0"
     postcss "^6.0.18"
     postcss "^6.0.18"
 
 
-postcss-custom-properties@^8.0.6:
-  version "8.0.6"
-  resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.6.tgz#404d2f0848abef200807ac1587ab7758983416fa"
+postcss-custom-properties@^8.0.8:
+  version "8.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.8.tgz#1812e2553805e1affce93164dd1709ef6b69c53e"
   dependencies:
   dependencies:
-    postcss "^7.0.3"
+    postcss "^7.0.5"
     postcss-values-parser "^2.0.0"
     postcss-values-parser "^2.0.0"
 
 
 postcss-custom-selectors@^4.0.1:
 postcss-custom-selectors@^4.0.1:
@@ -10060,22 +10127,23 @@ postcss-place@^4.0.1:
     postcss "^7.0.2"
     postcss "^7.0.2"
     postcss-values-parser "^2.0.0"
     postcss-values-parser "^2.0.0"
 
 
-postcss-preset-env@6.0.7:
-  version "6.0.7"
-  resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.0.7.tgz#c1c48c58fdd8e8df6fe30a5b645a16266c653697"
+postcss-preset-env@6.1.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.1.1.tgz#c2c8038c3bdedb6b80cfc10f05ba90ff4612972a"
   dependencies:
   dependencies:
     autoprefixer "^9.1.5"
     autoprefixer "^9.1.5"
-    browserslist "^4.1.1"
-    caniuse-lite "^1.0.30000887"
+    browserslist "^4.2.0"
+    caniuse-lite "^1.0.30000890"
     cssdb "^3.2.1"
     cssdb "^3.2.1"
-    postcss "^7.0.3"
+    postcss "^7.0.5"
     postcss-attribute-case-insensitive "^4.0.0"
     postcss-attribute-case-insensitive "^4.0.0"
     postcss-color-functional-notation "^2.0.1"
     postcss-color-functional-notation "^2.0.1"
+    postcss-color-gray "^5.0.0"
     postcss-color-hex-alpha "^5.0.2"
     postcss-color-hex-alpha "^5.0.2"
     postcss-color-mod-function "^3.0.3"
     postcss-color-mod-function "^3.0.3"
     postcss-color-rebeccapurple "^4.0.1"
     postcss-color-rebeccapurple "^4.0.1"
-    postcss-custom-media "^7.0.4"
-    postcss-custom-properties "^8.0.6"
+    postcss-custom-media "^7.0.6"
+    postcss-custom-properties "^8.0.8"
     postcss-custom-selectors "^5.1.2"
     postcss-custom-selectors "^5.1.2"
     postcss-dir-pseudo-class "^5.0.0"
     postcss-dir-pseudo-class "^5.0.0"
     postcss-env-function "^2.0.2"
     postcss-env-function "^2.0.2"
@@ -10296,9 +10364,9 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2:
     source-map "^0.6.1"
     source-map "^0.6.1"
     supports-color "^5.4.0"
     supports-color "^5.4.0"
 
 
-postcss@^7.0.3:
-  version "7.0.4"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.4.tgz#b5a059597d2c1a8a9916cb6efb0b294f70b4f309"
+postcss@^7.0.5:
+  version "7.0.5"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55"
   dependencies:
   dependencies:
     chalk "^2.4.1"
     chalk "^2.4.1"
     source-map "^0.6.1"
     source-map "^0.6.1"
@@ -10435,6 +10503,13 @@ proxy-addr@~2.0.3:
     forwarded "~0.1.2"
     forwarded "~0.1.2"
     ipaddr.js "1.6.0"
     ipaddr.js "1.6.0"
 
 
+proxy-addr@~2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.8.0"
+
 prr@~1.0.1:
 prr@~1.0.1:
   version "1.0.1"
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -10912,6 +10987,10 @@ redis-commands@^1.2.0:
   version "1.3.5"
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
   resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.5.tgz#4495889414f1e886261180b1442e7295602d83a2"
 
 
+redis-commands@^1.3.5:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f"
+
 redis-errors@^1.0.0, redis-errors@^1.2.0:
 redis-errors@^1.0.0, redis-errors@^1.2.0:
   version "1.2.0"
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
   resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad"
@@ -10959,10 +11038,6 @@ reduce-function-call@^1.0.1, reduce-function-call@^1.0.2:
   dependencies:
   dependencies:
     balanced-match "^0.4.2"
     balanced-match "^0.4.2"
 
 
-redux-thunk@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
-
 redux@^3.4.0:
 redux@^3.4.0:
   version "3.7.2"
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
   resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
@@ -11018,6 +11093,10 @@ regexpp@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365"
 
 
+regexpp@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+
 regexpu-core@^1.0.0:
 regexpu-core@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
@@ -11209,9 +11288,9 @@ require_optional@^1.0.1:
     resolve-from "^2.0.0"
     resolve-from "^2.0.0"
     semver "^5.1.0"
     semver "^5.1.0"
 
 
-reselect@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
+reselect@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7"
 
 
 resolve-cwd@^2.0.0:
 resolve-cwd@^2.0.0:
   version "2.0.0"
   version "2.0.0"
@@ -11488,7 +11567,11 @@ semver@4.3.2:
   version "4.3.2"
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
   resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
 
 
-semver@5.5.1, semver@^5.5.1:
+semver@5.6.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+
+semver@^5.5.1:
   version "5.5.1"
   version "5.5.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
 
 
@@ -11714,10 +11797,6 @@ source-list-map@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
 
 
-source-list-map@~0.1.7:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
-
 source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
 source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
   version "0.5.2"
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
   resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
@@ -11749,7 +11828,7 @@ source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, sourc
   version "0.5.7"
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
 
 
-source-map@^0.4.2, source-map@~0.4.1:
+source-map@^0.4.2:
   version "0.4.4"
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
   dependencies:
   dependencies:
@@ -12013,12 +12092,12 @@ strip-outer@^1.0.0:
   dependencies:
   dependencies:
     escape-string-regexp "^1.0.2"
     escape-string-regexp "^1.0.2"
 
 
-style-loader@0.23.0:
-  version "0.23.0"
-  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1"
+style-loader@0.23.1:
+  version "0.23.1"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
   dependencies:
   dependencies:
     loader-utils "^1.1.0"
     loader-utils "^1.1.0"
-    schema-utils "^0.4.5"
+    schema-utils "^1.0.0"
 
 
 stylehacks@^4.0.0:
 stylehacks@^4.0.0:
   version "4.0.0"
   version "4.0.0"
@@ -12118,14 +12197,12 @@ symbol-tree@^3.2.2:
   version "3.2.2"
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
 
 
-table@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc"
+table@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7"
   dependencies:
   dependencies:
-    ajv "^6.0.1"
-    ajv-keywords "^3.0.0"
-    chalk "^2.1.0"
-    lodash "^4.17.4"
+    ajv "^6.5.3"
+    lodash "^4.17.10"
     slice-ansi "1.0.0"
     slice-ansi "1.0.0"
     string-width "^2.1.1"
     string-width "^2.1.1"
 
 
@@ -12652,9 +12729,9 @@ urix@^0.1.0:
   version "0.1.0"
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
 
 
-url-loader@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1"
+url-loader@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8"
   dependencies:
   dependencies:
     loader-utils "^1.1.0"
     loader-utils "^1.1.0"
     mime "^2.0.3"
     mime "^2.0.3"
@@ -12779,9 +12856,9 @@ vasync@^1.6.4:
   dependencies:
   dependencies:
     verror "1.6.0"
     verror "1.6.0"
 
 
-vee-validate@2.1.0-beta.9:
-  version "2.1.0-beta.9"
-  resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-2.1.0-beta.9.tgz#2a838177cd2ab6efc1f5352d6854e889ecb883cf"
+vee-validate@2.1.0-beta.11:
+  version "2.1.0-beta.11"
+  resolved "https://registry.yarnpkg.com/vee-validate/-/vee-validate-2.1.0-beta.11.tgz#d1e7c9996a9aeff173a36b3308c2201faee23e30"
 
 
 velocity-animate@1.5.2:
 velocity-animate@1.5.2:
   version "1.5.2"
   version "1.5.2"
@@ -12913,9 +12990,9 @@ vue-loader@15.4.2:
     vue-hot-reload-api "^2.3.0"
     vue-hot-reload-api "^2.3.0"
     vue-style-loader "^4.1.0"
     vue-style-loader "^4.1.0"
 
 
-vue-material-design-icons@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/vue-material-design-icons/-/vue-material-design-icons-2.1.1.tgz#16470d9f21d79fc7d95405d83990a8ac9e472b0c"
+vue-material-design-icons@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/vue-material-design-icons/-/vue-material-design-icons-2.3.0.tgz#fa5c138eeb3b74ff45da2d9ef953b3ff1eebd889"
 
 
 vue-moment@4.0.0:
 vue-moment@4.0.0:
   version "4.0.0"
   version "4.0.0"
@@ -12989,9 +13066,9 @@ vuedraggable@2.16.0:
   dependencies:
   dependencies:
     sortablejs "^1.7.0"
     sortablejs "^1.7.0"
 
 
-vuetify@1.2.5:
-  version "1.2.5"
-  resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-1.2.5.tgz#91578367709b20e406f2cdc7a164dfd70df954d9"
+vuetify@1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-1.2.9.tgz#1c0d00f9a76620931ef4c662bfafe12f120b0d52"
 
 
 vuex-pathify@1.1.3:
 vuex-pathify@1.1.3:
   version "1.1.3"
   version "1.1.3"
@@ -13108,13 +13185,6 @@ webpack-cli@3.1.2:
     v8-compile-cache "^2.0.2"
     v8-compile-cache "^2.0.2"
     yargs "^12.0.2"
     yargs "^12.0.2"
 
 
-webpack-core@^0.6.8:
-  version "0.6.9"
-  resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
-  dependencies:
-    source-list-map "~0.1.7"
-    source-map "~0.4.1"
-
 webpack-dev-middleware@3.4.0:
 webpack-dev-middleware@3.4.0:
   version "3.4.0"
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890"
   resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890"
@@ -13124,9 +13194,9 @@ webpack-dev-middleware@3.4.0:
     range-parser "^1.0.3"
     range-parser "^1.0.3"
     webpack-log "^2.0.0"
     webpack-log "^2.0.0"
 
 
-webpack-hot-middleware@2.24.2:
-  version "2.24.2"
-  resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.24.2.tgz#0d2deeb813f67693e2997b87c3a9d9be324575dd"
+webpack-hot-middleware@2.24.3:
+  version "2.24.3"
+  resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz#5bb76259a8fc0d97463ab517640ba91d3382d4a6"
   dependencies:
   dependencies:
     ansi-html "0.0.7"
     ansi-html "0.0.7"
     html-entities "^1.2.0"
     html-entities "^1.2.0"
@@ -13160,11 +13230,11 @@ webpack-sources@^1.3.0:
     source-list-map "^2.0.0"
     source-list-map "^2.0.0"
     source-map "~0.6.1"
     source-map "~0.6.1"
 
 
-webpack-subresource-integrity@1.1.0-rc.6:
-  version "1.1.0-rc.6"
-  resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886"
+webpack-subresource-integrity@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.2.0.tgz#4cc8bdc2511482107d1d044bef1e5c4aa5058d84"
   dependencies:
   dependencies:
-    webpack-core "^0.6.8"
+    webpack-sources "^1.3.0"
 
 
 webpack@4.20.2:
 webpack@4.20.2:
   version "4.20.2"
   version "4.20.2"
@@ -13463,9 +13533,9 @@ xtend@^4.0.0, xtend@~4.0.1:
   version "4.0.1"
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
 
-xterm@3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.7.0.tgz#b3eb1335dc04b92abe361711731d3b661e13db17"
+xterm@3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.8.0.tgz#55d1de518bdc9c9793823f5e4e97d6898972938d"
 
 
 y18n@^3.2.1:
 y18n@^3.2.1:
   version "3.2.1"
   version "3.2.1"