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

This commit is contained in:
Nicolas Giard 2018-10-13 23:22:42 -04:00
parent 3caa842d18
commit 14e34d4346
12 changed files with 742 additions and 376 deletions

View File

@ -7,10 +7,11 @@ import VueSimpleBreakpoints from 'vue-simple-breakpoints'
import VeeValidate from 'vee-validate'
import { ApolloClient } from 'apollo-client'
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 { ErrorLink } from 'apollo-link-error'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { getMainDefinition } from 'apollo-utilities'
import VueApollo from 'vue-apollo'
@ -54,24 +55,47 @@ moment.locale(siteConfig.lang)
const graphQLEndpoint = window.location.protocol + '//' + window.location.host + '/graphql'
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,
uri: graphQLEndpoint,
credentials: 'include',
fetch: (uri, options) => {
fetch: async (uri, options) => {
// Strip __typename fields from variables
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)
// Inject authentication token
@ -80,10 +104,17 @@ const graphQLLink = createPersistedQueryLink().concat(
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({
uri: graphQLWSEndpoint,

View File

@ -7,109 +7,121 @@
.admin-header-title
.headline.blue--text.text--darken-2 Edit Group
.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
.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-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='permissions', :transition='false', :reverse-transition='false')
v-card
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, @click='deleteGroupDialog = false') Cancel
v-btn(color='red', dark, @click='deleteGroup') Delete
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='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='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='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')
</template>

View File

@ -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>

View File

@ -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>

View File

@ -8,99 +8,97 @@
.headline.blue--text.text--darken-2 Users
.subheading.grey--text Manage users
v-spacer
v-btn(outline, color='grey', large)
v-btn(outline, color='grey', large, @click='refresh')
v-icon refresh
v-btn(color='primary', large, depressed)
v-btn(color='primary', large, depressed, @click='authorizeUser')
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
span New User
span New Local User
v-card.mt-3
v-data-table(
v-model='selected'
:items='items',
:items='users',
:headers='headers',
:search='search',
:pagination.sync='pagination',
:rows-per-page-items='[15]'
select-all,
hide-actions,
disable-initial-sort
)
template(slot='headers', slot-scope='props')
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(
v-for='header in props.headers'
:key='header.text'
: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)'
)
| {{ header.text }}
v-icon(small) arrow_upward
v-icon(small, v-if='header.sortable') arrow_upward
template(slot='items', slot-scope='props')
tr(:active='props.selected')
td
//- td
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: strong {{ props.item.name }}
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')
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
v-pagination(v-model='pagination.page', :length='pages')
user-authorize(v-model='isAuthorizeDialogShown')
user-create(v-model='isCreateDialogShown')
</template>
<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 {
components: {
UserAuthorize,
UserCreate
},
data() {
return {
selected: [],
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: [
{ 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 }
],
search: ''
search: '',
isAuthorizeDialogShown: false,
isCreateDialogShown: false
}
},
computed: {
@ -113,6 +111,20 @@ export default {
}
},
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) {
if (this.pagination.sortBy === column) {
this.pagination.descending = !this.pagination.descending
@ -128,6 +140,16 @@ export default {
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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

416
yarn.lock
View File

@ -917,6 +917,14 @@
dependencies:
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":
version "0.5.13"
resolved "https://registry.yarnpkg.com/@pm2/agent/-/agent-0.5.13.tgz#e3778413a01ace791527d66b50ff8c3b7b87bcdc"
@ -932,10 +940,11 @@
semver "^5.5.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:
"@pm2/agent-node" "^1.0.6"
async "^2.6.1"
debug "3.1.0"
deep-metrics "0.0.2"
@ -1161,9 +1170,9 @@
version "0.8.0"
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:
chalk "^2.4.1"
execa "^0.10.0"
@ -1178,16 +1187,16 @@
semver "^5.5.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:
"@akryum/winattr" "^3.0.0"
"@vue/cli-shared-utils" "^3.0.4"
"@vue/cli-shared-utils" "^3.0.5"
chalk "^2.4.1"
clone "^2.1.1"
deepmerge "^2.1.1"
@ -1213,13 +1222,13 @@
vue-cli-plugin-apollo "^0.16.6"
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:
"@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"
cmd-shim "^2.0.2"
commander "^2.16.0"
@ -1476,7 +1485,7 @@ ajv-errors@^1.0.0:
version "1.0.0"
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"
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"
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:
version "6.5.0"
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"
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"
resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.0.tgz#3bbadeea01a84c7d67f49872c87912a06f1678df"
dependencies:
@ -2581,13 +2589,13 @@ browserslist@^4.1.0:
electron-to-chromium "^1.3.61"
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:
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:
version "1.1.0"
@ -2822,9 +2830,9 @@ caniuse-lite@^1.0.30000884:
version "1.0.30000885"
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:
version "1.0.0"
@ -3468,9 +3476,9 @@ copy-descriptor@^0.1.0:
version "0.1.1"
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:
cacache "^10.0.4"
find-cache-dir "^1.0.0"
@ -3947,6 +3955,10 @@ data-urls@^1.0.0:
whatwg-mimetype "^2.0.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:
version "0.1.4"
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"
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:
version "6.4.0"
@ -4646,9 +4658,9 @@ eslint-visitor-keys@^1.0.0:
version "1.0.0"
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:
"@babel/code-frame" "^7.0.0"
ajv "^6.5.3"
@ -4681,12 +4693,12 @@ eslint@5.6.1:
path-is-inside "^1.0.2"
pluralize "^7.0.0"
progress "^2.0.0"
regexpp "^2.0.0"
regexpp "^2.0.1"
require-uncached "^1.0.3"
semver "^5.5.1"
strip-ansi "^4.0.0"
strip-json-comments "^2.0.1"
table "^4.0.3"
table "^5.0.2"
text-table "^0.2.0"
esm@^3.0.84:
@ -4886,7 +4898,42 @@ express-session@1.15.6:
uid-safe "~2.1.5"
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"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
dependencies:
@ -5074,9 +5121,9 @@ file-loader@2.0.0:
loader-utils "^1.0.2"
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:
version "3.9.0"
@ -5213,9 +5260,9 @@ flush-write-stream@^1.0.0:
inherits "^2.0.1"
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:
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"
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:
apollo-link "^1.2.3"
apollo-utilities "^1.0.1"
@ -5759,9 +5810,9 @@ graphql-type-json@^0.2.1:
version "0.2.1"
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:
"@f/animate" "^1.0.1"
"@material-ui/core" "^3.0.2"
@ -5772,9 +5823,9 @@ graphql-voyager@1.0.0-rc.25:
prop-types "^15.6.2"
react-redux "^5.0.7"
redux "^4.0.0"
redux-thunk "^2.3.0"
reselect "^3.0.1"
reselect "^4.0.0"
svg-pan-zoom "^3.5.2"
viz.js "2.0.0"
graphql@14.0.2:
version "14.0.2"
@ -5921,9 +5972,9 @@ hex-color-regex@^1.1.0:
version "1.1.0"
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:
version "1.0.1"
@ -6070,9 +6121,9 @@ hyphenate-style-name@^1.0.2:
version "1.0.2"
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:
cookies "0.7.1"
@ -6091,9 +6142,9 @@ i18next-xhr-backend@1.5.1:
version "1.5.1"
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:
version "0.4.19"
@ -6293,17 +6344,14 @@ invert-kv@^2.0.0:
version "2.0.0"
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:
cluster-key-slot "^1.0.6"
debug "^3.1.0"
denque "^1.1.0"
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.difference "^4.5.0"
lodash.flatten "^4.4.0"
@ -6314,7 +6362,7 @@ ioredis@4.0.0:
lodash.sample "^4.2.1"
lodash.shuffle "^4.2.0"
lodash.values "^4.3.0"
redis-commands "^1.2.0"
redis-commands "^1.3.5"
redis-errors "^1.2.0"
redis-parser "^3.0.0"
standard-as-callback "^1.0.0"
@ -6351,6 +6399,10 @@ ipaddr.js@1.6.0:
version "1.6.0"
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:
version "2.1.0"
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"
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:
loader-utils "^1.1.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"
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:
bson "^1.1.0"
require_optional "^1.0.1"
@ -7991,11 +8043,11 @@ mongodb-core@3.1.5:
optionalDependencies:
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:
mongodb-core "3.1.5"
mongodb-core "3.1.7"
safe-buffer "^5.1.2"
move-concurrently@^1.0.1:
@ -8025,9 +8077,9 @@ mssql@4.2.1:
generic-pool "^3.4.2"
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:
append-field "^1.0.0"
busboy "^0.2.11"
@ -8275,6 +8327,12 @@ node-releases@^1.0.0-alpha.11:
dependencies:
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:
version "4.9.3"
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-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:
buffer-writer "1.0.1"
packet-reader "0.3.1"
@ -9230,12 +9288,12 @@ pm2-multimeter@^0.1.2:
dependencies:
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:
"@pm2/agent" "^0.5.11"
"@pm2/io" "~2.3.11"
"@pm2/io" "~2.4.2"
"@pm2/js-api" "^0.5.15"
async "^2.6.1"
blessed "^0.1.81"
@ -9244,6 +9302,7 @@ pm2@3.1.3:
cli-table-redemption "^1.0.0"
commander "2.15.1"
cron "^1.3"
date-fns "^1.29.0"
debug "^3.1"
eventemitter2 "5.0.1"
fclone "1.0.11"
@ -9356,6 +9415,14 @@ postcss-color-gray@^4.0.0:
postcss-message-helpers "^2.0.0"
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:
version "3.0.0"
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:
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:
postcss "^7.0.2"
postcss "^7.0.5"
postcss-custom-properties@^6.1.0:
version "6.3.1"
@ -9514,11 +9581,11 @@ postcss-custom-properties@^6.1.0:
balanced-match "^1.0.0"
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:
postcss "^7.0.3"
postcss "^7.0.5"
postcss-values-parser "^2.0.0"
postcss-custom-selectors@^4.0.1:
@ -10060,22 +10127,23 @@ postcss-place@^4.0.1:
postcss "^7.0.2"
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:
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"
postcss "^7.0.3"
postcss "^7.0.5"
postcss-attribute-case-insensitive "^4.0.0"
postcss-color-functional-notation "^2.0.1"
postcss-color-gray "^5.0.0"
postcss-color-hex-alpha "^5.0.2"
postcss-color-mod-function "^3.0.3"
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-dir-pseudo-class "^5.0.0"
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"
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:
chalk "^2.4.1"
source-map "^0.6.1"
@ -10435,6 +10503,13 @@ proxy-addr@~2.0.3:
forwarded "~0.1.2"
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:
version "1.0.1"
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"
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:
version "1.2.0"
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:
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:
version "3.7.2"
resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
@ -11018,6 +11093,10 @@ regexpp@^2.0.0:
version "2.0.0"
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:
version "1.0.0"
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"
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:
version "2.0.0"
@ -11488,7 +11567,11 @@ semver@4.3.2:
version "4.3.2"
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"
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"
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:
version "0.5.2"
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"
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"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
dependencies:
@ -12013,12 +12092,12 @@ strip-outer@^1.0.0:
dependencies:
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:
loader-utils "^1.1.0"
schema-utils "^0.4.5"
schema-utils "^1.0.0"
stylehacks@^4.0.0:
version "4.0.0"
@ -12118,14 +12197,12 @@ symbol-tree@^3.2.2:
version "3.2.2"
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:
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"
string-width "^2.1.1"
@ -12652,9 +12729,9 @@ urix@^0.1.0:
version "0.1.0"
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:
loader-utils "^1.1.0"
mime "^2.0.3"
@ -12779,9 +12856,9 @@ vasync@^1.6.4:
dependencies:
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:
version "1.5.2"
@ -12913,9 +12990,9 @@ vue-loader@15.4.2:
vue-hot-reload-api "^2.3.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:
version "4.0.0"
@ -12989,9 +13066,9 @@ vuedraggable@2.16.0:
dependencies:
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:
version "1.1.3"
@ -13108,13 +13185,6 @@ webpack-cli@3.1.2:
v8-compile-cache "^2.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:
version "3.4.0"
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"
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:
ansi-html "0.0.7"
html-entities "^1.2.0"
@ -13160,11 +13230,11 @@ webpack-sources@^1.3.0:
source-list-map "^2.0.0"
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:
webpack-core "^0.6.8"
webpack-sources "^1.3.0"
webpack@4.20.2:
version "4.20.2"
@ -13463,9 +13533,9 @@ xtend@^4.0.0, xtend@~4.0.1:
version "4.0.1"
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:
version "3.2.1"