From 14e34d4346edf622409d0c3f99156cb7fe205d84 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sat, 13 Oct 2018 23:22:42 -0400 Subject: [PATCH] feat: jwt renew via graphql + users create/authorize UI --- client/client-app.js | 67 ++- client/components/admin/admin-groups-edit.vue | 210 ++++----- .../admin/admin-users-authorize.vue | 115 +++++ .../components/admin/admin-users-create.vue | 105 +++++ client/components/admin/admin-users.vue | 126 +++--- client/graph/admin/users/users-query-list.gql | 2 - .../admin/users/users-query-strategies.gql | 12 + package.json | 58 +-- server/graph/resolvers/user.js | 4 +- server/graph/schemas/user.graphql | 1 + server/middlewares/auth.js | 2 +- yarn.lock | 416 ++++++++++-------- 12 files changed, 742 insertions(+), 376 deletions(-) create mode 100644 client/components/admin/admin-users-authorize.vue create mode 100644 client/components/admin/admin-users-create.vue create mode 100644 client/graph/admin/users/users-query-strategies.gql diff --git a/client/client-app.js b/client/client-app.js index 7fe8c56b..aa1c7eda 100644 --- a/client/client-app.js +++ b/client/client-app.js @@ -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, diff --git a/client/components/admin/admin-groups-edit.vue b/client/components/admin/admin-groups-edit.vue index 595a03b0..49086a6f 100644 --- a/client/components/admin/admin-groups-edit.vue +++ b/client/components/admin/admin-groups-edit.vue @@ -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') diff --git a/client/components/admin/admin-users-authorize.vue b/client/components/admin/admin-users-authorize.vue new file mode 100644 index 00000000..32469570 --- /dev/null +++ b/client/components/admin/admin-users-authorize.vue @@ -0,0 +1,115 @@ + + + diff --git a/client/components/admin/admin-users-create.vue b/client/components/admin/admin-users-create.vue new file mode 100644 index 00000000..7c1dfc92 --- /dev/null +++ b/client/components/admin/admin-users-create.vue @@ -0,0 +1,105 @@ + + + diff --git a/client/components/admin/admin-users.vue b/client/components/admin/admin-users.vue index a1a1b7b7..c75ad938 100644 --- a/client/components/admin/admin-users.vue +++ b/client/components/admin/admin-users.vue @@ -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') diff --git a/client/graph/admin/users/users-query-list.gql b/client/graph/admin/users/users-query-list.gql index 62e7faf9..c9696a0d 100644 --- a/client/graph/admin/users/users-query-list.gql +++ b/client/graph/admin/users/users-query-list.gql @@ -5,9 +5,7 @@ query { name email providerKey - role createdAt - updatedAt } } } diff --git a/client/graph/admin/users/users-query-strategies.gql b/client/graph/admin/users/users-query-strategies.gql new file mode 100644 index 00000000..510af56f --- /dev/null +++ b/client/graph/admin/users/users-query-strategies.gql @@ -0,0 +1,12 @@ +query { + authentication { + strategies( + isEnabled: true + ) { + key + title + icon + color + } + } +} diff --git a/package.json b/package.json index 940f44e7..2b2072bc 100644 --- a/package.json +++ b/package.json @@ -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%", diff --git a/server/graph/resolvers/user.js b/server/graph/resolvers/user.js index 63cb85c7..9d9619c5 100644 --- a/server/graph/resolvers/user.js +++ b/server/graph/resolvers/user.js @@ -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) diff --git a/server/graph/schemas/user.graphql b/server/graph/schemas/user.graphql index 60d1bdc2..59fdc30d 100644 --- a/server/graph/schemas/user.graphql +++ b/server/graph/schemas/user.graphql @@ -86,6 +86,7 @@ type UserMinimal { name: String! email: String! providerKey: String! + createdAt: Date! } type User { diff --git a/server/middlewares/auth.js b/server/middlewares/auth.js index 270d80e7..c975d08a 100644 --- a/server/middlewares/auth.js +++ b/server/middlewares/auth.js @@ -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() }) } diff --git a/yarn.lock b/yarn.lock index e8e9c37b..6cd21069 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"