Merge branch 'master' of github.com:Human-Connection/Human-Connection into 1710-list-and-protocol-moderation

This commit is contained in:
Wolfgang Huß 2019-11-18 07:59:44 +01:00
commit 4a732beb0a
51 changed files with 346 additions and 271 deletions

View File

@ -6,6 +6,7 @@
* [Neo4J](neo4j/README.md) * [Neo4J](neo4j/README.md)
* [Backend](backend/README.md) * [Backend](backend/README.md)
* [GraphQL](backend/graphql.md) * [GraphQL](backend/graphql.md)
* [neo4j-graphql-js](backend/neo4j-graphql-js.md)
* [Webapp](webapp/README.md) * [Webapp](webapp/README.md)
* [Components](webapp/components.md) * [Components](webapp/components.md)
* [HTML](webapp/html.md) * [HTML](webapp/html.md)

View File

@ -0,0 +1,16 @@
# neo4j-graphql.js
We use an npm package called `neo4j-graphql-js` as a cypher query builder. This
library also generates resolvers for graphql queries, unless we implement them
ourselves.
## Debugging
As you can see in their [documentation](https://github.com/neo4j-graphql/neo4j-graphql-js)
it is possible to log out the generated cypher statements. To do so, run the
backend like this:
```sh
DEBUG=neo4j-graphql-js yarn run dev
```

View File

@ -83,7 +83,7 @@
"minimatch": "^3.0.4", "minimatch": "^3.0.4",
"mustache": "^3.1.0", "mustache": "^3.1.0",
"neo4j-driver": "~1.7.6", "neo4j-driver": "~1.7.6",
"neo4j-graphql-js": "^2.8.0", "neo4j-graphql-js": "^2.9.0",
"neode": "^0.3.3", "neode": "^0.3.3",
"node-fetch": "~2.6.0", "node-fetch": "~2.6.0",
"nodemailer": "^6.3.1", "nodemailer": "^6.3.1",
@ -110,7 +110,7 @@
"babel-eslint": "~10.0.3", "babel-eslint": "~10.0.3",
"babel-jest": "~24.9.0", "babel-jest": "~24.9.0",
"chai": "~4.2.0", "chai": "~4.2.0",
"cucumber": "~6.0.3", "cucumber": "~6.0.5",
"eslint": "~6.6.0", "eslint": "~6.6.0",
"eslint-config-prettier": "~6.5.0", "eslint-config-prettier": "~6.5.0",
"eslint-config-standard": "~14.1.0", "eslint-config-standard": "~14.1.0",

View File

@ -3,7 +3,7 @@ import { neo4jgraphql } from 'neo4j-graphql-js'
export default { export default {
Query: { Query: {
Badge: async (object, args, context, resolveInfo) => { Badge: async (object, args, context, resolveInfo) => {
return neo4jgraphql(object, args, context, resolveInfo, false) return neo4jgraphql(object, args, context, resolveInfo)
}, },
}, },
} }

View File

@ -43,15 +43,15 @@ export default {
Post: async (object, params, context, resolveInfo) => { Post: async (object, params, context, resolveInfo) => {
params = await filterForBlockedUsers(params, context) params = await filterForBlockedUsers(params, context)
params = await maintainPinnedPosts(params) params = await maintainPinnedPosts(params)
return neo4jgraphql(object, params, context, resolveInfo, false) return neo4jgraphql(object, params, context, resolveInfo)
}, },
findPosts: async (object, params, context, resolveInfo) => { findPosts: async (object, params, context, resolveInfo) => {
params = await filterForBlockedUsers(params, context) params = await filterForBlockedUsers(params, context)
return neo4jgraphql(object, params, context, resolveInfo, false) return neo4jgraphql(object, params, context, resolveInfo)
}, },
profilePagePosts: async (object, params, context, resolveInfo) => { profilePagePosts: async (object, params, context, resolveInfo) => {
params = await filterForBlockedUsers(params, context) params = await filterForBlockedUsers(params, context)
return neo4jgraphql(object, params, context, resolveInfo, false) return neo4jgraphql(object, params, context, resolveInfo)
}, },
PostsEmotionsCountByEmotion: async (object, params, context, resolveInfo) => { PostsEmotionsCountByEmotion: async (object, params, context, resolveInfo) => {
const session = context.driver.session() const session = context.driver.session()

View File

@ -54,7 +54,7 @@ export default {
user = await user.toJson() user = await user.toJson()
return [user.node] return [user.node]
} }
return neo4jgraphql(object, args, context, resolveInfo, false) return neo4jgraphql(object, args, context, resolveInfo)
}, },
}, },
Mutation: { Mutation: {

View File

@ -2790,10 +2790,10 @@ cssstyle@^1.0.0:
dependencies: dependencies:
cssom "0.3.x" cssom "0.3.x"
cucumber-expressions@^8.0.1: cucumber-expressions@^8.1.0:
version "8.0.1" version "8.2.1"
resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-8.0.1.tgz#47eb87dcb626e90a4672986da1130f3c470b9e3d" resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-8.2.1.tgz#e250063993350df106a8664c90a414814f555e2d"
integrity sha512-g+A+tUEafNofe6ErwvOkqaMvDj9NuOr0GouGotpw4r5yK2d4144o9/6sQpXBr2YXbRy5ItmER/2bzAyDAzhPyQ== integrity sha512-6n5JKbAzXfIiwyu2UyUcOmO83QmuSme25+Dw2taK6VNOybOfRkh4yNMA9VtuAJHOmsX3/8l0OVjTbE8lHnjOHA==
dependencies: dependencies:
becke-ch--regex--s0-0-v1--base--pl--lib "^1.4.0" becke-ch--regex--s0-0-v1--base--pl--lib "^1.4.0"
xregexp "^4.2.4" xregexp "^4.2.4"
@ -2803,17 +2803,17 @@ cucumber-tag-expressions@^2.0.2:
resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.2.tgz#aac27aae3690818ec15235bd056282dad8a2d2b8" resolved "https://registry.yarnpkg.com/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.2.tgz#aac27aae3690818ec15235bd056282dad8a2d2b8"
integrity sha512-DohmT4X641KX/sb96bdb7J2kXNcQBPrYmf3Oc5kiHCLfzFMWx/o2kB4JvjvQPZnYuA9lRt6pqtArM5gvUn4uzw== integrity sha512-DohmT4X641KX/sb96bdb7J2kXNcQBPrYmf3Oc5kiHCLfzFMWx/o2kB4JvjvQPZnYuA9lRt6pqtArM5gvUn4uzw==
cucumber@~6.0.3: cucumber@~6.0.5:
version "6.0.3" version "6.0.5"
resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-6.0.3.tgz#bf69ecc992772e580dabe265b2ed06ddab13d076" resolved "https://registry.yarnpkg.com/cucumber/-/cucumber-6.0.5.tgz#cdc752ad18b551bcf7bc92774c925302f4408714"
integrity sha512-FSx7xdAQfFjcxp/iRBAuCFSXp2iJP1tF2Q5k/a67YgHiYbnwsD9F+UNv9ZG90LFHNsNQhb+67AmVxHkp4JRDpg== integrity sha512-x+W9Fwk6TvcapQsYMxwFU5AsQJDOIJVGrPKmH15OC7jzb9/Dk7Hb0ZAyw4WcpaDcUDRc8bi2k2yJejDp5eTRlg==
dependencies: dependencies:
assertion-error-formatter "^3.0.0" assertion-error-formatter "^3.0.0"
bluebird "^3.4.1" bluebird "^3.4.1"
cli-table3 "^0.5.1" cli-table3 "^0.5.1"
colors "^1.1.2" colors "^1.1.2"
commander "^3.0.1" commander "^3.0.1"
cucumber-expressions "^8.0.1" cucumber-expressions "^8.1.0"
cucumber-tag-expressions "^2.0.2" cucumber-tag-expressions "^2.0.2"
duration "^0.2.1" duration "^0.2.1"
escape-string-regexp "^2.0.0" escape-string-regexp "^2.0.0"
@ -3981,7 +3981,7 @@ glob-parent@^5.0.0:
dependencies: dependencies:
is-glob "^4.0.1" is-glob "^4.0.1"
glob@7.1.6: glob@7.1.6, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.1.6" version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@ -3993,18 +3993,6 @@ glob@7.1.6:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.1.5"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0"
integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^0.1.0: global-dirs@^0.1.0:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
@ -6070,10 +6058,10 @@ neo4j-driver@^1.7.3, neo4j-driver@^1.7.5, neo4j-driver@~1.7.6:
text-encoding-utf-8 "^1.0.2" text-encoding-utf-8 "^1.0.2"
uri-js "^4.2.2" uri-js "^4.2.2"
neo4j-graphql-js@^2.8.0: neo4j-graphql-js@^2.9.0:
version "2.8.0" version "2.9.0"
resolved "https://registry.yarnpkg.com/neo4j-graphql-js/-/neo4j-graphql-js-2.8.0.tgz#58035b9213656e17b6ed4c6cbf4dfe1c56a8a219" resolved "https://registry.yarnpkg.com/neo4j-graphql-js/-/neo4j-graphql-js-2.9.0.tgz#b214a0546479565cb5b812fb7e602f2136d36a0d"
integrity sha512-nDuzmi6W/YGIIVm+GAXCr/8CLABsU/RfeLebLH32vqeKViFATMfm4eT66aOq/GwHJ0838+o20yCbIFdx5rTP/A== integrity sha512-vpOUPwx7Xwn2EZoe0i9z+AMJ4uwZeUjWDGiR4ZAR6ebNd5BaYpiC9SihYOZlS3hVXHZxADQfpGhz9dx++lZwlg==
dependencies: dependencies:
"@babel/runtime" "^7.5.5" "@babel/runtime" "^7.5.5"
"@babel/runtime-corejs2" "^7.5.5" "@babel/runtime-corejs2" "^7.5.5"

View File

@ -2,11 +2,15 @@ version: "3.4"
services: services:
webapp: webapp:
environment:
- "CI=${CI}"
image: humanconnection/nitro-web:build-and-test image: humanconnection/nitro-web:build-and-test
build: build:
context: webapp context: webapp
target: build-and-test target: build-and-test
backend: backend:
environment:
- "CI=${CI}"
image: humanconnection/nitro-backend:build-and-test image: humanconnection/nitro-backend:build-and-test
build: build:
context: backend context: backend

View File

@ -69,7 +69,7 @@ export default {
if (!this.user.slug) { if (!this.user.slug) {
return [] return []
} }
let routes = [ const routes = [
{ {
name: this.$t('profile.name'), name: this.$t('profile.name'),
path: `/profile/${this.user.id}/${this.user.slug}`, path: `/profile/${this.user.id}/${this.user.slug}`,

View File

@ -9,7 +9,7 @@ describe('Category', () => {
let icon let icon
let name let name
let Wrapper = () => { const Wrapper = () => {
return shallowMount(Category, { return shallowMount(Category, {
localVue, localVue,
propsData: { propsData: {

View File

@ -53,7 +53,7 @@ export default {
}, },
computed: { computed: {
routes() { routes() {
let routes = [] const routes = []
if (this.resourceType === 'contribution') { if (this.resourceType === 'contribution') {
if (this.isOwner) { if (this.isOwner) {

View File

@ -223,7 +223,7 @@ export default {
this.form.teaserImage = file this.form.teaserImage = file
}, },
categoryIds(categories) { categoryIds(categories) {
let categoryIds = [] const categoryIds = []
categories.map(categoryId => { categories.map(categoryId => {
categoryIds.push(categoryId.id) categoryIds.push(categoryId.id)
}) })

View File

@ -101,7 +101,7 @@ export default {
} }
}, },
handleSubmit() { handleSubmit() {
let resourceArgs = [] const resourceArgs = []
if (this.deleteContributions) { if (this.deleteContributions) {
resourceArgs.push('Post') resourceArgs.push('Post')
} }

View File

@ -79,7 +79,7 @@ describe('Editor.vue', () => {
describe('limists suggestion list to 15 users', () => { describe('limists suggestion list to 15 users', () => {
beforeEach(() => { beforeEach(() => {
let manyUsersList = [] const manyUsersList = []
for (let i = 0; i < 25; i++) { for (let i = 0; i < 25; i++) {
manyUsersList.push({ id: `user${i}` }) manyUsersList.push({ id: `user${i}` })
} }
@ -120,7 +120,7 @@ describe('Editor.vue', () => {
describe('limists suggestion list to 15 hashtags', () => { describe('limists suggestion list to 15 hashtags', () => {
beforeEach(() => { beforeEach(() => {
let manyHashtagsList = [] const manyHashtagsList = []
for (let i = 0; i < 25; i++) { for (let i = 0; i < 25; i++) {
manyHashtagsList.push({ id: `hashtag${i}` }) manyHashtagsList.push({ id: `hashtag${i}` })
} }

View File

@ -27,7 +27,11 @@ const plugins = [
] ]
helpers.init({ plugins }) helpers.init({ plugins })
const users = [{ id: 1, slug: 'peter' }, { id: 2, slug: 'sandra' }, { id: 3, slug: 'jane' }] const users = [
{ id: 1, slug: 'peter' },
{ id: 2, slug: 'sandra' },
{ id: 3, slug: 'jane' },
]
storiesOf('Editor', module) storiesOf('Editor', module)
.addDecorator(withA11y) .addDecorator(withA11y)

View File

@ -377,6 +377,7 @@ li > p {
.embed-preview-image { .embed-preview-image {
width: 100%; width: 100%;
height: auto; height: auto;
max-height: 450px;
} }
.embed-preview-image--clickable { .embed-preview-image--clickable {

View File

@ -63,30 +63,26 @@ describe('defaultExtensions', () => {
it('recognizes embed code', () => { it('recognizes embed code', () => {
const editor = createEditor() const editor = createEditor()
const expected = { const expected = {
type: 'doc',
content: [ content: [
{ {
type: 'paragraph',
content: [ content: [
{ {
text: 'Baby loves cat:', text: 'Baby loves cat:',
type: 'text', type: 'text',
}, },
], ],
type: 'paragraph',
}, },
{ {
content: [ type: 'embed',
{
attrs: { attrs: {
dataEmbedUrl: 'https://www.youtube.com/watch?v=qkdXAtO40Fo', dataEmbedUrl: 'https://www.youtube.com/watch?v=qkdXAtO40Fo',
}, },
type: 'embed',
}, },
], ],
type: 'paragraph',
},
],
type: 'doc',
} }
expect(editor.getJSON()).toEqual(expected) expect(editor.getJSON()).toEqual(expected)
}) })
}) })

View File

@ -38,8 +38,8 @@ export default class Embed extends Node {
default: null, default: null,
}, },
}, },
group: 'inline', group: 'block',
inline: true, inline: false,
parseDOM: [ parseDOM: [
{ {
tag: 'a[href].embed', tag: 'a[href].embed',

View File

@ -5,6 +5,7 @@ export default class EventHandler extends Extension {
get name() { get name() {
return 'event_handler' return 'event_handler'
} }
get plugins() { get plugins() {
return [ return [
new Plugin({ new Plugin({

View File

@ -10,7 +10,7 @@ config.stubs['nuxt-link'] = '<span><slot /></span>'
describe('Hashtag', () => { describe('Hashtag', () => {
let id let id
let Wrapper = () => { const Wrapper = () => {
return shallowMount(Hashtag, { return shallowMount(Hashtag, {
localVue, localVue,
propsData: { propsData: {

View File

@ -58,7 +58,7 @@ export default {
return find(this.locales, { code: this.$i18n.locale() }) return find(this.locales, { code: this.$i18n.locale() })
}, },
routes() { routes() {
let routes = this.locales.map(locale => { const routes = this.locales.map(locale => {
return { return {
name: locale.name, name: locale.name,
path: locale.code, path: locale.code,

View File

@ -10,7 +10,7 @@ localVue.use(Styleguide)
localVue.use(Filters) localVue.use(Filters)
localVue.filter('truncate', string => string) localVue.filter('truncate', string => string)
config.stubs['dropdown'] = '<span class="dropdown"><slot /></span>' config.stubs.dropdown = '<span class="dropdown"><slot /></span>'
describe('NotificationMenu.vue', () => { describe('NotificationMenu.vue', () => {
let wrapper let wrapper

View File

@ -7,13 +7,13 @@ const localVue = createLocalVue()
localVue.use(Styleguide) localVue.use(Styleguide)
describe('Paginate.vue', () => { describe('Paginate.vue', () => {
let propsData, wrapper, Wrapper, nextButton, backButton let propsData, wrapper, nextButton, backButton
beforeEach(() => { beforeEach(() => {
propsData = {} propsData = {}
}) })
Wrapper = () => { const Wrapper = () => {
return mount(Paginate, { propsData, localVue }) return mount(Paginate, { propsData, localVue })
} }
describe('mount', () => { describe('mount', () => {

View File

@ -16,7 +16,7 @@ describe('RelativeDateTime', () => {
} }
}) })
let Wrapper = () => { const Wrapper = () => {
return shallowMount(RelativeDateTime, { return shallowMount(RelativeDateTime, {
mocks, mocks,
localVue, localVue,

View File

@ -6,7 +6,7 @@ const localVue = createLocalVue()
describe('Ribbon', () => { describe('Ribbon', () => {
let text let text
let Wrapper = () => { const Wrapper = () => {
return shallowMount(Ribbon, { return shallowMount(Ribbon, {
localVue, localVue,
propsData: { propsData: {

View File

@ -64,7 +64,7 @@ export default {
}, },
watch: { watch: {
error() { error() {
let that = this const that = this
setTimeout(function() { setTimeout(function() {
that.error = false that.error = false
}, 2000) }, 2000)

View File

@ -43,7 +43,7 @@ export default {
}, },
watch: { watch: {
error() { error() {
let that = this const that = this
setTimeout(function() { setTimeout(function() {
that.error = false that.error = false
}, 2000) }, 2000)

View File

@ -8,7 +8,7 @@ beforeEach(() => {
}) })
describe('validReport', () => { describe('validReport', () => {
let validate = object => { const validate = object => {
const { formSchema } = validReport({ translate }) const { formSchema } = validReport({ translate })
const validator = new Schema(formSchema) const validator = new Schema(formSchema)
return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => { return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => {

View File

@ -14,7 +14,7 @@ beforeEach(() => {
}) })
describe('UniqueSlugForm', () => { describe('UniqueSlugForm', () => {
let validate = object => { const validate = object => {
const { formSchema } = UniqueSlugForm({ translate, apollo, currentUser }) const { formSchema } = UniqueSlugForm({ translate, apollo, currentUser })
const validator = new Schema(formSchema) const validator = new Schema(formSchema)
return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => { return validator.validate(object, { suppressWarning: true }).catch(({ errors }) => {

View File

@ -6,11 +6,7 @@
<ds-flex class="main-navigation-flex"> <ds-flex class="main-navigation-flex">
<ds-flex-item :width="{ lg: '3.5%' }" /> <ds-flex-item :width="{ lg: '3.5%' }" />
<ds-flex-item :width="{ base: '80%', sm: '80%', md: '80%', lg: '15%' }"> <ds-flex-item :width="{ base: '80%', sm: '80%', md: '80%', lg: '15%' }">
<nuxt-link <nuxt-link :to="{ name: 'index' }" v-scroll-to="'.main-navigation'">
:to="{ name: 'index' }"
@click.native="refreshPosts({ i18n: $i18n })"
v-scroll-to="'.main-navigation'"
>
<ds-logo /> <ds-logo />
</nuxt-link> </nuxt-link>
</ds-flex-item> </ds-flex-item>
@ -143,7 +139,6 @@ export default {
...mapActions({ ...mapActions({
quickSearchClear: 'search/quickClear', quickSearchClear: 'search/quickClear',
quickSearch: 'search/quickSearch', quickSearch: 'search/quickSearch',
refreshPosts: 'posts/refreshPosts',
}), }),
goToPost(item) { goToPost(item) {
this.$nextTick(() => { this.$nextTick(() => {

View File

@ -313,12 +313,14 @@
}, },
"columns": { "columns": {
"name": "Name", "name": "Name",
"slug": "Alias" "slug": "Alias",
"unblock": "Entblocken"
}, },
"empty": "Bislang hast du niemanden blockiert.", "empty": "Bislang hast du niemanden blockiert.",
"how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.", "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.",
"block": "Nutzer blockieren", "block": "Nutzer blockieren",
"unblock": "Nutzer entblocken" "unblock": "Nutzer entblocken",
"unblocked": "{name} ist wieder entblockt"
} }
}, },
"admin": { "admin": {

View File

@ -314,12 +314,14 @@
}, },
"columns": { "columns": {
"name": "Name", "name": "Name",
"slug": "Slug" "slug": "Slug",
"unblock": "Unblock"
}, },
"empty": "So far, you have not blocked anybody.", "empty": "So far, you have not blocked anybody.",
"how-to": "You can block other users on their profile page via the content menu.", "how-to": "You can block other users on their profile page via the content menu.",
"block": "Block user", "block": "Block user",
"unblock": "Unblock user" "unblock": "Unblock user",
"unblocked": "{name} is unblocked again"
} }
}, },
"admin": { "admin": {

View File

@ -1,7 +1,7 @@
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
export default async ({ store, env, route, redirect }) => { export default async ({ store, env, route, redirect }) => {
let publicPages = env.publicPages const publicPages = env.publicPages
// only affect non public pages // only affect non public pages
if (publicPages.indexOf(route.name) >= 0) { if (publicPages.indexOf(route.name) >= 0) {
return true return true
@ -17,7 +17,7 @@ export default async ({ store, env, route, redirect }) => {
// await store.dispatch('auth/logout', null, { root: true }) // await store.dispatch('auth/logout', null, { root: true })
// set the redirect path for after the login // set the redirect path for after the login
let params = {} const params = {}
if (!isEmpty(route.path) && route.path !== '/') { if (!isEmpty(route.path) && route.path !== '/') {
params.path = route.path params.path = route.path
} }

View File

@ -1,7 +1,7 @@
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
export default async ({ store, env, route, redirect }) => { export default async ({ store, env, route, redirect }) => {
let publicPages = env.publicPages const publicPages = env.publicPages
// only affect non public pages // only affect non public pages
if (publicPages.indexOf(route.name) >= 0) { if (publicPages.indexOf(route.name) >= 0) {
return true return true
@ -11,7 +11,7 @@ export default async ({ store, env, route, redirect }) => {
if (store.getters['auth/termsAndConditionsAgreed']) return true if (store.getters['auth/termsAndConditionsAgreed']) return true
let params = {} const params = {}
if (!isEmpty(route.path) && route.path !== '/') { if (!isEmpty(route.path) && route.path !== '/') {
params.path = route.path params.path = route.path
} }

View File

@ -118,7 +118,7 @@ export default {
{ src: '~/plugins/v-tooltip.js', ssr: false }, { src: '~/plugins/v-tooltip.js', ssr: false },
{ src: '~/plugins/izi-toast.js', ssr: false }, { src: '~/plugins/izi-toast.js', ssr: false },
{ src: '~/plugins/vue-filters.js' }, { src: '~/plugins/vue-filters.js' },
{ src: '~/plugins/vue-infinite-scroll.js', ssr: false }, { src: '~/plugins/vue-infinite-loading.js', ssr: false },
], ],
router: { router: {

View File

@ -83,7 +83,7 @@
"v-tooltip": "~2.0.2", "v-tooltip": "~2.0.2",
"validator": "^12.0.0", "validator": "^12.0.0",
"vue-count-to": "~1.0.13", "vue-count-to": "~1.0.13",
"vue-infinite-scroll": "^2.0.2", "vue-infinite-loading": "^2.4.4",
"vue-izitoast": "^1.2.1", "vue-izitoast": "^1.2.1",
"vue-scrollto": "^2.17.1", "vue-scrollto": "^2.17.1",
"vue-sweetalert-icons": "~4.2.0", "vue-sweetalert-icons": "~4.2.0",
@ -111,17 +111,17 @@
"babel-preset-vue": "~2.0.2", "babel-preset-vue": "~2.0.2",
"core-js": "~2.6.10", "core-js": "~2.6.10",
"css-loader": "~3.2.0", "css-loader": "~3.2.0",
"eslint": "~5.16.0", "eslint": "~6.6.0",
"eslint-config-prettier": "~6.5.0", "eslint-config-prettier": "~6.5.0",
"eslint-config-standard": "~12.0.0", "eslint-config-standard": "~14.1.0",
"eslint-loader": "~3.0.2", "eslint-loader": "~3.0.2",
"eslint-plugin-import": "~2.18.2", "eslint-plugin-import": "~2.18.2",
"eslint-plugin-jest": "~23.0.2", "eslint-plugin-jest": "~23.0.4",
"eslint-plugin-node": "~10.0.0", "eslint-plugin-node": "~10.0.0",
"eslint-plugin-prettier": "~3.1.1", "eslint-plugin-prettier": "~3.1.1",
"eslint-plugin-promise": "~4.2.1", "eslint-plugin-promise": "~4.2.1",
"eslint-plugin-standard": "~4.0.1", "eslint-plugin-standard": "~4.0.1",
"eslint-plugin-vue": "~6.0.0", "eslint-plugin-vue": "~6.0.1",
"faker": "^4.1.0", "faker": "^4.1.0",
"flush-promises": "^1.0.2", "flush-promises": "^1.0.2",
"fuse.js": "^3.4.5", "fuse.js": "^3.4.5",
@ -129,7 +129,7 @@
"jest": "~24.9.0", "jest": "~24.9.0",
"mutation-observer": "^1.0.3", "mutation-observer": "^1.0.3",
"node-sass": "~4.13.0", "node-sass": "~4.13.0",
"prettier": "~1.18.2", "prettier": "~1.19.1",
"sass-loader": "~8.0.0", "sass-loader": "~8.0.0",
"storybook-design-token": "^0.4.1", "storybook-design-token": "^0.4.1",
"storybook-vue-router": "^1.0.7", "storybook-vue-router": "^1.0.7",

View File

@ -1,9 +1,7 @@
<template> <template>
<ds-card :header="$t('admin.hashtags.name')"> <ds-card :header="$t('admin.hashtags.name')">
<ds-table :data="Tag" :fields="fields" condensed> <ds-table :data="Tag" :fields="fields" condensed>
<template slot="index" slot-scope="scope"> <template slot="index" slot-scope="scope">{{ scope.index + 1 }}.</template>
{{ scope.index + 1 }}.
</template>
<template slot="id" slot-scope="scope"> <template slot="id" slot-scope="scope">
<nuxt-link :to="{ path: '/', query: { hashtag: encodeURI(scope.row.id) } }"> <nuxt-link :to="{ path: '/', query: { hashtag: encodeURI(scope.row.id) } }">
<b>#{{ scope.row.id | truncate(20) }}</b> <b>#{{ scope.row.id | truncate(20) }}</b>

View File

@ -20,9 +20,7 @@
</ds-space> </ds-space>
<ds-card v-if="User && User.length"> <ds-card v-if="User && User.length">
<ds-table :data="User" :fields="fields" condensed> <ds-table :data="User" :fields="fields" condensed>
<template slot="index" slot-scope="scope"> <template slot="index" slot-scope="scope">{{ scope.row.index + 1 }}.</template>
{{ scope.row.index + 1 }}.
</template>
<template slot="name" slot-scope="scope"> <template slot="name" slot-scope="scope">
<nuxt-link <nuxt-link
:to="{ :to="{

View File

@ -5,7 +5,7 @@ import Styleguide from '@human-connection/styleguide'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import VTooltip from 'v-tooltip' import VTooltip from 'v-tooltip'
import FilterMenu from '~/components/FilterMenu/FilterMenu' import FilterMenu from '~/components/FilterMenu/FilterMenu'
import InfiniteScroll from '~/plugins/vue-infinite-scroll' import InfiniteLoading from '~/plugins/vue-infinite-loading'
const localVue = createLocalVue() const localVue = createLocalVue()
@ -13,11 +13,12 @@ localVue.use(Vuex)
localVue.use(Styleguide) localVue.use(Styleguide)
localVue.use(Filters) localVue.use(Filters)
localVue.use(VTooltip) localVue.use(VTooltip)
localVue.use(InfiniteScroll) localVue.use(InfiniteLoading)
config.stubs['client-only'] = '<span><slot /></span>' config.stubs['client-only'] = '<span><slot /></span>'
config.stubs['router-link'] = '<span><slot /></span>' config.stubs['router-link'] = '<span><slot /></span>'
config.stubs['nuxt-link'] = '<span><slot /></span>' config.stubs['nuxt-link'] = '<span><slot /></span>'
config.stubs['infinite-loading'] = '<span><slot /></span>'
describe('PostIndex', () => { describe('PostIndex', () => {
let wrapper let wrapper
@ -29,7 +30,6 @@ describe('PostIndex', () => {
beforeEach(() => { beforeEach(() => {
mutations = { mutations = {
'posts/SELECT_ORDER': jest.fn(), 'posts/SELECT_ORDER': jest.fn(),
'posts/SET_CURRENT_POSTS': jest.fn(),
} }
store = new Vuex.Store({ store = new Vuex.Store({
getters: { getters: {
@ -54,7 +54,6 @@ describe('PostIndex', () => {
'auth/user': () => { 'auth/user': () => {
return { id: 'u23' } return { id: 'u23' }
}, },
'posts/currentPosts': () => [],
}, },
mutations, mutations,
}) })

View File

@ -16,7 +16,7 @@
</div> </div>
</ds-grid-item> </ds-grid-item>
<template v-if="hasResults"> <template v-if="hasResults">
<masonry-grid-item v-for="post in currentPosts" :key="post.id"> <masonry-grid-item v-for="post in posts" :key="post.id">
<hc-post-card <hc-post-card
:post="post" :post="post"
:width="{ base: '100%', xs: '100%', md: '50%', xl: '33%' }" :width="{ base: '100%', xs: '100%', md: '50%', xl: '33%' }"
@ -44,16 +44,11 @@
primary primary
/> />
</client-only> </client-only>
<div <client-only>
v-if="hasMore" <infinite-loading v-if="hasMore" @infinite="showMoreContributions">
v-infinite-scroll="showMoreContributions"
:infinite-scroll-disabled="$apollo.loading"
:infinite-scroll-distance="10"
:infinite-scroll-throttle-delay="800"
:infinite-scroll-immediate-check="true"
>
<hc-load-more :loading="$apollo.loading" @click="showMoreContributions" /> <hc-load-more :loading="$apollo.loading" @click="showMoreContributions" />
</div> </infinite-loading>
</client-only>
</div> </div>
</template> </template>
@ -97,7 +92,6 @@ export default {
orderBy: 'posts/orderBy', orderBy: 'posts/orderBy',
selectedOrder: 'posts/selectedOrder', selectedOrder: 'posts/selectedOrder',
sortingIcon: 'posts/orderIcon', sortingIcon: 'posts/orderIcon',
currentPosts: 'posts/currentPosts',
}), }),
selected: { selected: {
get() { get() {
@ -105,7 +99,7 @@ export default {
}, },
set({ value }) { set({ value }) {
this.offset = 0 this.offset = 0
this.setCurrentPosts([]) this.posts = []
this.selectOrder(value) this.selectOrder(value)
}, },
}, },
@ -123,13 +117,12 @@ export default {
return filter return filter
}, },
hasResults() { hasResults() {
return this.$apollo.loading || (this.currentPosts && this.currentPosts.length > 0) return this.$apollo.loading || (this.posts && this.posts.length > 0)
}, },
}, },
methods: { methods: {
...mapMutations({ ...mapMutations({
selectOrder: 'posts/SELECT_ORDER', selectOrder: 'posts/SELECT_ORDER',
setCurrentPosts: 'posts/SET_CURRENT_POSTS',
}), }),
clearSearch() { clearSearch() {
this.$router.push({ path: '/' }) this.$router.push({ path: '/' })
@ -141,7 +134,7 @@ export default {
params: { id: post.id, slug: post.slug }, params: { id: post.id, slug: post.slug },
}).href }).href
}, },
showMoreContributions() { showMoreContributions($state) {
const { Post: PostQuery } = this.$apollo.queries const { Post: PostQuery } = this.$apollo.queries
if (!PostQuery) return // seems this can be undefined on subpages if (!PostQuery) return // seems this can be undefined on subpages
@ -156,7 +149,9 @@ export default {
updateQuery: (previousResult, { fetchMoreResult }) => { updateQuery: (previousResult, { fetchMoreResult }) => {
if (!fetchMoreResult || fetchMoreResult.Post.length < this.pageSize) { if (!fetchMoreResult || fetchMoreResult.Post.length < this.pageSize) {
this.hasMore = false this.hasMore = false
$state.complete()
} }
const result = { const result = {
...previousResult, ...previousResult,
Post: [ Post: [
@ -168,19 +163,19 @@ export default {
...fetchMoreResult.Post, ...fetchMoreResult.Post,
], ],
} }
this.setCurrentPosts(result.Post) $state.loaded()
return result
}, },
}) })
}, },
deletePost(deletedPost) { deletePost(deletedPost) {
const posts = this.currentPosts.filter(post => { this.posts = this.posts.filter(post => {
return post.id !== deletedPost.id return post.id !== deletedPost.id
}) })
this.setCurrentPosts(posts)
}, },
resetPostList() { resetPostList() {
this.offset = 0 this.offset = 0
this.setCurrentPosts([]) this.posts = []
this.hasMore = true this.hasMore = true
}, },
pinPost(post) { pinPost(post) {
@ -224,7 +219,7 @@ export default {
} }
}, },
update({ Post }) { update({ Post }) {
this.setCurrentPosts(Post) this.posts = Post
}, },
fetchPolicy: 'cache-and-network', fetchPolicy: 'cache-and-network',
}, },

View File

@ -3,19 +3,20 @@ import ProfileSlug from './_slug.vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import Styleguide from '@human-connection/styleguide' import Styleguide from '@human-connection/styleguide'
import Filters from '~/plugins/vue-filters' import Filters from '~/plugins/vue-filters'
import InfiniteScroll from '~/plugins/vue-infinite-scroll' import InfiniteLoading from '~/plugins/vue-infinite-loading'
const localVue = createLocalVue() const localVue = createLocalVue()
localVue.use(Vuex) localVue.use(Vuex)
localVue.use(Styleguide) localVue.use(Styleguide)
localVue.use(Filters) localVue.use(Filters)
localVue.use(InfiniteScroll) localVue.use(InfiniteLoading)
localVue.filter('date', d => d) localVue.filter('date', d => d)
config.stubs['client-only'] = '<span><slot /></span>' config.stubs['client-only'] = '<span><slot /></span>'
config.stubs['v-popover'] = '<span><slot /></span>' config.stubs['v-popover'] = '<span><slot /></span>'
config.stubs['nuxt-link'] = '<span><slot /></span>' config.stubs['nuxt-link'] = '<span><slot /></span>'
config.stubs['infinite-loading'] = '<span><slot /></span>'
describe('ProfileSlug', () => { describe('ProfileSlug', () => {
let wrapper let wrapper
@ -127,23 +128,6 @@ describe('ProfileSlug', () => {
}) })
}) })
describe('pagination returned less posts than available', () => {
beforeEach(() => {
const posts = [1, 2, 3, 4, 5].map(id => {
return {
...aPost,
id,
}
})
wrapper.setData({ posts, hasMore: true })
})
it('does not display a "load more" button', () => {
expect(wrapper.find('.load-more').exists()).toBe(false)
})
})
describe('pagination returned at least as many posts as pageSize', () => { describe('pagination returned at least as many posts as pageSize', () => {
beforeEach(() => { beforeEach(() => {
const posts = [1, 2, 3, 4, 5, 6].map(id => { const posts = [1, 2, 3, 4, 5, 6].map(id => {

View File

@ -255,16 +255,11 @@
</ds-grid-item> </ds-grid-item>
</template> </template>
</masonry-grid> </masonry-grid>
<div <client-only>
v-if="hasMore && posts.length >= pageSize" <infinite-loading v-if="hasMore" @infinite="showMoreContributions">
v-infinite-scroll="showMoreContributions"
:infinite-scroll-disabled="$apollo.loading"
:infinite-scroll-distance="10"
:infinite-scroll-throttle-delay="800"
:infinite-scroll-immediate-check="true"
>
<hc-load-more :loading="$apollo.loading" @click="showMoreContributions" /> <hc-load-more :loading="$apollo.loading" @click="showMoreContributions" />
</div> </infinite-loading>
</client-only>
</ds-flex-item> </ds-flex-item>
</ds-flex> </ds-flex>
</div> </div>
@ -378,7 +373,7 @@ export default {
uniq(items, field = 'id') { uniq(items, field = 'id') {
return uniqBy(items, field) return uniqBy(items, field)
}, },
showMoreContributions() { showMoreContributions($state) {
const { profilePagePosts: PostQuery } = this.$apollo.queries const { profilePagePosts: PostQuery } = this.$apollo.queries
if (!PostQuery) return // seems this can be undefined on subpages if (!PostQuery) return // seems this can be undefined on subpages
this.offset += this.pageSize this.offset += this.pageSize
@ -393,6 +388,7 @@ export default {
updateQuery: (previousResult, { fetchMoreResult }) => { updateQuery: (previousResult, { fetchMoreResult }) => {
if (!fetchMoreResult || fetchMoreResult.profilePagePosts.length < this.pageSize) { if (!fetchMoreResult || fetchMoreResult.profilePagePosts.length < this.pageSize) {
this.hasMore = false this.hasMore = false
$state.complete()
} }
const result = { const result = {
...previousResult, ...previousResult,
@ -406,6 +402,7 @@ export default {
...fetchMoreResult.profilePagePosts, ...fetchMoreResult.profilePagePosts,
], ],
} }
$state.loaded()
return result return result
}, },
}) })

View File

@ -0,0 +1,69 @@
import { config, mount, createLocalVue } from '@vue/test-utils'
import BlockedUsers from './blocked-users.vue'
import Styleguide from '@human-connection/styleguide'
import Filters from '~/plugins/vue-filters'
import { Unblock } from '~/graphql/settings/BlockedUsers'
const localVue = createLocalVue()
localVue.use(Styleguide)
localVue.use(Filters)
config.stubs['nuxt-link'] = '<span><slot /></span>'
describe('blocked-users.vue', () => {
let wrapper
let mocks
beforeEach(() => {
mocks = {
$t: jest.fn(),
$apollo: {
mutate: jest.fn(),
queries: {
blockedUsers: {
refetch: jest.fn(),
},
},
},
$toast: {
error: jest.fn(),
success: jest.fn(),
},
}
})
describe('mount', () => {
const Wrapper = () => {
return mount(BlockedUsers, { mocks, localVue })
}
beforeEach(() => {
wrapper = Wrapper()
})
it('renders', () => {
expect(wrapper.is('div')).toBe(true)
})
describe('given a list of blocked users', () => {
beforeEach(() => {
const blockedUsers = [{ id: 'u1', name: 'John Doe', slug: 'john-doe', avatar: '' }]
wrapper.setData({ blockedUsers })
})
describe('click unblock', () => {
beforeEach(() => {
wrapper.find('button').trigger('click')
})
it('calls unblock mutation with given user', () => {
expect(mocks.$apollo.mutate).toHaveBeenCalledWith({
mutation: Unblock(),
variables: { id: 'u1' },
})
})
})
})
})
})

View File

@ -56,6 +56,10 @@
<b>{{ scope.row.slug | truncate(20) }}</b> <b>{{ scope.row.slug | truncate(20) }}</b>
</nuxt-link> </nuxt-link>
</template> </template>
<template slot="unblock" slot-scope="scope">
<ds-button size="small" @click="unblock(scope)"><ds-icon name="user-plus" /></ds-button>
</template>
</ds-table> </ds-table>
</ds-card> </ds-card>
<ds-card v-else> <ds-card v-else>
@ -74,7 +78,7 @@
</template> </template>
<script> <script>
import { BlockedUsers } from '~/graphql/settings/BlockedUsers' import { BlockedUsers, Unblock } from '~/graphql/settings/BlockedUsers'
import HcAvatar from '~/components/Avatar/Avatar.vue' import HcAvatar from '~/components/Avatar/Avatar.vue'
export default { export default {
@ -92,12 +96,21 @@ export default {
avatar: '', avatar: '',
name: this.$t('settings.blocked-users.columns.name'), name: this.$t('settings.blocked-users.columns.name'),
slug: this.$t('settings.blocked-users.columns.slug'), slug: this.$t('settings.blocked-users.columns.slug'),
unblock: this.$t('settings.blocked-users.columns.unblock'),
} }
}, },
}, },
apollo: { apollo: {
blockedUsers: { query: BlockedUsers, fetchPolicy: 'cache-and-network' }, blockedUsers: { query: BlockedUsers, fetchPolicy: 'cache-and-network' },
}, },
methods: {
async unblock(user) {
await this.$apollo.mutate({ mutation: Unblock(), variables: { id: user.row.id } })
this.$apollo.queries.blockedUsers.refetch()
const { name } = user.row
this.$toast.success(this.$t('settings.blocked-users.unblocked', { name }))
},
},
} }
</script> </script>

View File

@ -117,7 +117,7 @@ export default {
this.loadingData = true this.loadingData = true
const { name, slug, about } = this.formData const { name, slug, about } = this.formData
let { locationName } = this.formData || this.currentUser let { locationName } = this.formData || this.currentUser
locationName = locationName && (locationName['label'] || locationName) locationName = locationName && (locationName.label || locationName)
try { try {
await this.$apollo.mutate({ await this.$apollo.mutate({
mutation, mutation,
@ -154,7 +154,7 @@ export default {
if (!res || !res.data || !res.data.features || !res.data.features.length) { if (!res || !res.data || !res.data.features || !res.data.features.length) {
return [] return []
} }
let output = [] const output = []
res.data.features.forEach(item => { res.data.features.forEach(item => {
output.push({ output.push({
label: item.place_name, label: item.place_name,

View File

@ -45,7 +45,11 @@ export default ({ app = {} }) => {
return value.join(glue) return value.join(glue)
}, },
listByKey: (values, key, glue, truncate) => { listByKey: (values, key, glue, truncate) => {
return app.$filters.list(values.map(item => item[key]), glue, truncate) return app.$filters.list(
values.map(item => item[key]),
glue,
truncate,
)
}, },
camelCase: (value = '') => { camelCase: (value = '') => {
return value return value

View File

@ -0,0 +1,4 @@
import Vue from 'vue'
import InfiniteLoading from 'vue-infinite-loading'
Vue.use(InfiniteLoading, { props: { distance: 10 }, system: { throttleLimit: 800 } })

View File

@ -1,4 +0,0 @@
import Vue from 'vue'
import infiniteScroll from 'vue-infinite-scroll'
Vue.use(infiniteScroll)

View File

@ -169,7 +169,10 @@ describe('actions', () => {
it('saves pending flags in order', () => { it('saves pending flags in order', () => {
expect(commit.mock.calls).toEqual( expect(commit.mock.calls).toEqual(
expect.arrayContaining([['SET_PENDING', true], ['SET_PENDING', false]]), expect.arrayContaining([
['SET_PENDING', true],
['SET_PENDING', false],
]),
) )
}) })
}) })
@ -207,7 +210,10 @@ describe('actions', () => {
await action({ commit }, { email: 'user@example.org', password: 'wrong' }) await action({ commit }, { email: 'user@example.org', password: 'wrong' })
} catch (err) {} // ignore } catch (err) {} // ignore
expect(commit.mock.calls).toEqual( expect(commit.mock.calls).toEqual(
expect.arrayContaining([['SET_PENDING', true], ['SET_PENDING', false]]), expect.arrayContaining([
['SET_PENDING', true],
['SET_PENDING', false],
]),
) )
}) })
}) })

View File

@ -4,8 +4,6 @@ import xor from 'lodash/xor'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import isEqual from 'lodash/isEqual' import isEqual from 'lodash/isEqual'
import clone from 'lodash/clone' import clone from 'lodash/clone'
import { filterPosts } from '~/graphql/PostQuery'
import { first, offset } from '~/constants/posts'
const defaultFilter = {} const defaultFilter = {}
@ -27,8 +25,7 @@ export const state = () => {
filter: { filter: {
...defaultFilter, ...defaultFilter,
}, },
order: orderOptions['createdAt_desc'], order: orderOptions.createdAt_desc,
currentPosts: [],
} }
} }
@ -77,9 +74,6 @@ export const mutations = {
SELECT_ORDER(state, value) { SELECT_ORDER(state, value) {
state.order = orderOptions[value] state.order = orderOptions[value]
}, },
SET_CURRENT_POSTS(state, posts) {
state.currentPosts = posts
},
} }
export const getters = { export const getters = {
@ -120,26 +114,4 @@ export const getters = {
orderIcon(state) { orderIcon(state) {
return state.order.icon return state.order.icon
}, },
currentPosts(state) {
return state.currentPosts || []
},
}
export const actions = {
async refreshPosts({ commit, getters }, { i18n }) {
const client = this.app.apolloProvider.defaultClient
const {
data: { Post },
} = await client.query({
query: filterPosts(i18n),
variables: {
filter: getters.filter,
first,
orderBy: ['pinned_asc', getters.orderBy],
offset,
},
})
commit('SET_CURRENT_POSTS', Post)
return Post
},
} }

View File

@ -3255,6 +3255,11 @@ acorn-jsx@^5.0.0:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
acorn-jsx@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
acorn-walk@^6.0.1, acorn-walk@^6.1.1: acorn-walk@^6.0.1, acorn-walk@^6.1.1:
version "6.1.1" version "6.1.1"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
@ -3275,6 +3280,11 @@ acorn@^6.2.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51"
integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==
acorn@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
address@1.0.3: address@1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
@ -3338,17 +3348,7 @@ ajv-keywords@^3.4.1:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
version "6.10.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
dependencies:
fast-deep-equal "^2.0.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^6.10.2:
version "6.10.2" version "6.10.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
@ -5465,6 +5465,13 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0:
dependencies: dependencies:
restore-cursor "^2.0.0" restore-cursor "^2.0.0"
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-spinners@^2.0.0: cli-spinners@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.1.0.tgz#22c34b4d51f573240885b201efda4e4ec9fff3c7"
@ -7052,10 +7059,10 @@ eslint-config-prettier@^6.0.0, eslint-config-prettier@~6.5.0:
dependencies: dependencies:
get-stdin "^6.0.0" get-stdin "^6.0.0"
eslint-config-standard@~12.0.0: eslint-config-standard@~14.1.0:
version "12.0.0" version "14.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4"
integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==
eslint-import-resolver-node@^0.3.2: eslint-import-resolver-node@^0.3.2:
version "0.3.2" version "0.3.2"
@ -7109,10 +7116,10 @@ eslint-plugin-import@~2.18.2:
read-pkg-up "^2.0.0" read-pkg-up "^2.0.0"
resolve "^1.11.0" resolve "^1.11.0"
eslint-plugin-jest@~23.0.2: eslint-plugin-jest@~23.0.4:
version "23.0.2" version "23.0.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.2.tgz#54a59bfe77245186afe13711a297067aefefff0a" resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.4.tgz#1ab81ffe3b16c5168efa72cbd4db14d335092aa0"
integrity sha512-fkxcvOJm0hC/jbJqYJjtuC9mvpTJqXd0Nixx7joVQvJoBQuXk/ws3+MtRYzD/4TcKSgvr21uuSLdwSxKJKC2cg== integrity sha512-OaP8hhT8chJNodUPvLJ6vl8gnalcsU/Ww1t9oR3HnGdEWjm/DdCCUXLOral+IPGAeWu/EwgVQCK/QtxALpH1Yw==
dependencies: dependencies:
"@typescript-eslint/experimental-utils" "^2.5.0" "@typescript-eslint/experimental-utils" "^2.5.0"
@ -7145,12 +7152,12 @@ eslint-plugin-standard@~4.0.1:
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4"
integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==
eslint-plugin-vue@~6.0.0: eslint-plugin-vue@~6.0.1:
version "6.0.0" version "6.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.0.tgz#fc7a4116dff614a27be8639fb47973703dd332fa" resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.1.tgz#166d3eb24cf290f3ff24d44fe9fca496f3924fc2"
integrity sha512-+LxTJCd6nDt+AKQ1X+ySD48xJHft8OkeQmAhiq6UoAMxRFTiEKIDusiGgEUJLwKyiwGUGWbbqEbbWvupH5TSjg== integrity sha512-5tgFPcxGDKjfVB/6Yi56bKiWxygUibfZmzSh26Np3kuwAk/lfaGbVld+Yt+MPgD84ppvcachtiL4/winsXLjXA==
dependencies: dependencies:
vue-eslint-parser "^6.0.4" vue-eslint-parser "^6.0.5"
eslint-scope@^4.0.0, eslint-scope@^4.0.3: eslint-scope@^4.0.0, eslint-scope@^4.0.3:
version "4.0.3" version "4.0.3"
@ -7168,66 +7175,67 @@ eslint-scope@^5.0.0:
esrecurse "^4.1.0" esrecurse "^4.1.0"
estraverse "^4.1.1" estraverse "^4.1.1"
eslint-utils@^1.3.1, eslint-utils@^1.4.2: eslint-utils@^1.4.2, eslint-utils@^1.4.3:
version "1.4.2" version "1.4.3"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
dependencies: dependencies:
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.1.0"
eslint-visitor-keys@^1.0.0: eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@~5.16.0: eslint@~6.6.0:
version "5.16.0" version "6.6.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04"
integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==
dependencies: dependencies:
"@babel/code-frame" "^7.0.0" "@babel/code-frame" "^7.0.0"
ajv "^6.9.1" ajv "^6.10.0"
chalk "^2.1.0" chalk "^2.1.0"
cross-spawn "^6.0.5" cross-spawn "^6.0.5"
debug "^4.0.1" debug "^4.0.1"
doctrine "^3.0.0" doctrine "^3.0.0"
eslint-scope "^4.0.3" eslint-scope "^5.0.0"
eslint-utils "^1.3.1" eslint-utils "^1.4.3"
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.1.0"
espree "^5.0.1" espree "^6.1.2"
esquery "^1.0.1" esquery "^1.0.1"
esutils "^2.0.2" esutils "^2.0.2"
file-entry-cache "^5.0.1" file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1" functional-red-black-tree "^1.0.1"
glob "^7.1.2" glob-parent "^5.0.0"
globals "^11.7.0" globals "^11.7.0"
ignore "^4.0.6" ignore "^4.0.6"
import-fresh "^3.0.0" import-fresh "^3.0.0"
imurmurhash "^0.1.4" imurmurhash "^0.1.4"
inquirer "^6.2.2" inquirer "^7.0.0"
js-yaml "^3.13.0" is-glob "^4.0.0"
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1" json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0" levn "^0.3.0"
lodash "^4.17.11" lodash "^4.17.14"
minimatch "^3.0.4" minimatch "^3.0.4"
mkdirp "^0.5.1" mkdirp "^0.5.1"
natural-compare "^1.4.0" natural-compare "^1.4.0"
optionator "^0.8.2" optionator "^0.8.2"
path-is-inside "^1.0.2"
progress "^2.0.0" progress "^2.0.0"
regexpp "^2.0.1" regexpp "^2.0.1"
semver "^5.5.1" semver "^6.1.2"
strip-ansi "^4.0.0" strip-ansi "^5.2.0"
strip-json-comments "^2.0.1" strip-json-comments "^3.0.1"
table "^5.2.3" table "^5.2.3"
text-table "^0.2.0" text-table "^0.2.0"
v8-compile-cache "^2.0.3"
esm@^3.2.25: esm@^3.2.25:
version "3.2.25" version "3.2.25"
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
espree@^5.0.0, espree@^5.0.1: espree@^5.0.0:
version "5.0.1" version "5.0.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
@ -7236,6 +7244,15 @@ espree@^5.0.0, espree@^5.0.1:
acorn-jsx "^5.0.0" acorn-jsx "^5.0.0"
eslint-visitor-keys "^1.0.0" eslint-visitor-keys "^1.0.0"
espree@^6.1.2:
version "6.1.2"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
dependencies:
acorn "^7.1.0"
acorn-jsx "^5.1.0"
eslint-visitor-keys "^1.1.0"
esprima@^3.1.3: esprima@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
@ -8121,7 +8138,7 @@ glob-parent@^3.1.0:
is-glob "^3.1.0" is-glob "^3.1.0"
path-dirname "^1.0.0" path-dirname "^1.0.0"
glob-parent@~5.1.0: glob-parent@^5.0.0, glob-parent@~5.1.0:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
@ -8981,7 +8998,7 @@ inquirer@6.2.2:
strip-ansi "^5.0.0" strip-ansi "^5.0.0"
through "^2.3.6" through "^2.3.6"
inquirer@^6.2.0: inquirer@^6.2.0, inquirer@^6.2.2:
version "6.5.0" version "6.5.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42"
integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==
@ -9000,22 +9017,22 @@ inquirer@^6.2.0:
strip-ansi "^5.1.0" strip-ansi "^5.1.0"
through "^2.3.6" through "^2.3.6"
inquirer@^6.2.2: inquirer@^7.0.0:
version "6.3.1" version "7.0.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a"
integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==
dependencies: dependencies:
ansi-escapes "^3.2.0" ansi-escapes "^4.2.1"
chalk "^2.4.2" chalk "^2.4.2"
cli-cursor "^2.1.0" cli-cursor "^3.1.0"
cli-width "^2.0.0" cli-width "^2.0.0"
external-editor "^3.0.3" external-editor "^3.0.3"
figures "^2.0.0" figures "^3.0.0"
lodash "^4.17.11" lodash "^4.17.15"
mute-stream "0.0.7" mute-stream "0.0.8"
run-async "^2.2.0" run-async "^2.2.0"
rxjs "^6.4.0" rxjs "^6.4.0"
string-width "^2.1.0" string-width "^4.1.0"
strip-ansi "^5.1.0" strip-ansi "^5.1.0"
through "^2.3.6" through "^2.3.6"
@ -11088,6 +11105,11 @@ mute-stream@0.0.7:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
mute-stream@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
nan@^2.12.1, nan@^2.13.2: nan@^2.12.1, nan@^2.13.2:
version "2.13.2" version "2.13.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
@ -12016,7 +12038,7 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-is-inside@^1.0.1, path-is-inside@^1.0.2: path-is-inside@^1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
@ -12879,10 +12901,10 @@ prettier@1.16.3:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
prettier@~1.18.2: prettier@~1.19.1:
version "1.18.2" version "1.19.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
pretty-bytes@^5.3.0: pretty-bytes@^5.3.0:
version "5.3.0" version "5.3.0"
@ -13970,6 +13992,14 @@ restore-cursor@^2.0.0:
onetime "^2.0.0" onetime "^2.0.0"
signal-exit "^3.0.2" signal-exit "^3.0.2"
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
ret@~0.1.10: ret@~0.1.10:
version "0.1.15" version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@ -15154,11 +15184,16 @@ strip-indent@^1.0.1:
dependencies: dependencies:
get-stdin "^4.0.1" get-stdin "^4.0.1"
strip-json-comments@^2.0.0, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: strip-json-comments@^2.0.0, strip-json-comments@~2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
strip-json-comments@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
style-loader@^0.23.1, style-loader@~0.23.1: style-loader@^0.23.1, style-loader@~0.23.1:
version "0.23.1" version "0.23.1"
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
@ -15300,7 +15335,7 @@ symbol.prototype.description@^1.0.0:
dependencies: dependencies:
has-symbols "^1.0.0" has-symbols "^1.0.0"
table@5.4.6: table@5.4.6, table@^5.2.3:
version "5.4.6" version "5.4.6"
resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
@ -15310,16 +15345,6 @@ table@5.4.6:
slice-ansi "^2.1.0" slice-ansi "^2.1.0"
string-width "^3.0.0" string-width "^3.0.0"
table@^5.2.3:
version "5.2.3"
resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2"
integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==
dependencies:
ajv "^6.9.1"
lodash "^4.17.11"
slice-ansi "^2.1.0"
string-width "^3.0.0"
tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3: tapable@^1.0.0, tapable@^1.0.0-beta.5, tapable@^1.1.3:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
@ -16159,6 +16184,11 @@ v-tooltip@~2.0.2:
popper.js "^1.15.0" popper.js "^1.15.0"
vue-resize "^0.4.5" vue-resize "^0.4.5"
v8-compile-cache@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
validate-npm-package-license@^3.0.1: validate-npm-package-license@^3.0.1:
version "3.0.4" version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@ -16284,10 +16314,10 @@ vue-count-to@~1.0.13:
resolved "https://registry.yarnpkg.com/vue-count-to/-/vue-count-to-1.0.13.tgz#3e7573ea6e64c2b2972f64e0a2ab2e23c7590ff3" resolved "https://registry.yarnpkg.com/vue-count-to/-/vue-count-to-1.0.13.tgz#3e7573ea6e64c2b2972f64e0a2ab2e23c7590ff3"
integrity sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ== integrity sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ==
vue-eslint-parser@^6.0.4: vue-eslint-parser@^6.0.5:
version "6.0.4" version "6.0.5"
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.4.tgz#56ff47e2c2644bff39951d5a284982c7ecd6f7fa" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz#c1c067c2755748e28f3872cd42e8c1c4c1a8059f"
integrity sha512-GYsDsDWwKaGtnkW4nGUxr01wqIO2FB9/QHQTW1Gl5SUr5OyQvpnR90/D+Gq2cIxURX7aJ7+VyD+37Yx9eFwTgw== integrity sha512-Bvjlx7rH1Ulvus56KHeLXOjEi3JMOYTa1GAqZr9lBQhd8weK8mV7U7V2l85yokBZEWHJQjLn6X3nosY8TzkOKg==
dependencies: dependencies:
debug "^4.1.1" debug "^4.1.1"
eslint-scope "^4.0.0" eslint-scope "^4.0.0"
@ -16301,10 +16331,10 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf"
integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g== integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==
vue-infinite-scroll@^2.0.2: vue-infinite-loading@^2.4.4:
version "2.0.2" version "2.4.4"
resolved "https://registry.yarnpkg.com/vue-infinite-scroll/-/vue-infinite-scroll-2.0.2.tgz#ca37a91fe92ee0ad3b74acf8682c00917144b711" resolved "https://registry.yarnpkg.com/vue-infinite-loading/-/vue-infinite-loading-2.4.4.tgz#8a9defb9ceeea797c057cb36bdf558a4b2ce409f"
integrity sha512-n+YghR059YmciANGJh9SsNWRi1YZEBVlODtmnb/12zI+4R72QZSWd+EuZ5mW6auEo/yaJXgxzwsuhvALVnm73A== integrity sha512-eIFBcyKqkivtsDDq7Ee5ybDJVGLxIzU1NcBJCHG7Zx9Ic66QEGzSPs2OPJlGUdtu0/RS7KpUER35ZP/a7FdSOg==
vue-izitoast@^1.2.1: vue-izitoast@^1.2.1:
version "1.2.1" version "1.2.1"