merge: master ok

This commit is contained in:
ogerly 2020-04-22 10:05:09 +02:00
commit 6e934ed6b2
20 changed files with 1881 additions and 717 deletions

View File

@ -41,8 +41,8 @@
"@sentry/node": "^5.15.4",
"apollo-cache-inmemory": "~1.6.5",
"apollo-client": "~2.6.8",
"apollo-link-context": "~1.0.19",
"apollo-link-http": "~1.5.16",
"apollo-link-context": "~1.0.20",
"apollo-link-http": "~1.5.17",
"apollo-server": "~2.11.0",
"apollo-server-express": "^2.12.0",
"aws-sdk": "^2.652.0",
@ -129,9 +129,9 @@
"eslint-plugin-prettier": "~3.1.2",
"eslint-plugin-promise": "~4.2.1",
"eslint-plugin-standard": "~4.0.1",
"jest": "~25.2.7",
"jest": "~25.3.0",
"nodemon": "~2.0.2",
"prettier": "~2.0.2",
"prettier": "~2.0.4",
"rosie": "^2.0.1",
"supertest": "~4.0.2"
},

File diff suppressed because it is too large Load Diff

View File

@ -38,9 +38,9 @@
"cypress-cucumber-preprocessor": "^2.2.1",
"cypress-file-upload": "^3.5.3",
"cypress-plugin-retries": "^1.5.2",
"date-fns": "^2.11.1",
"date-fns": "^2.12.0",
"dotenv": "^8.2.0",
"expect": "^25.2.7",
"expect": "^25.3.0",
"faker": "Marak/faker.js#master",
"graphql-request": "^1.8.2",
"import": "^0.0.6",

View File

@ -230,6 +230,7 @@ $space-small: 16px;
$space-x-small: 8px;
$space-xx-small: 4px;
$space-xxx-small: 2px;
$space-none: 0;
/**
* @tokens Size Height
@ -240,6 +241,7 @@ $size-height-base: 42px;
$size-height-large: 50px;
$size-height-xlarge: 60px;
$size-height-footer: 64px;
$size-height-connections: 315px;
$size-tappable-square: 44px;
$size-ribbon: 6px;

View File

@ -40,6 +40,7 @@ export default class Embed extends Node {
},
group: 'inline',
inline: true,
selectable: false,
parseDOM: [
{
tag: 'a[href].embed',

View File

@ -3,9 +3,11 @@
<span class="initials">{{ userInitials }}</span>
<base-icon v-if="isAnonymous" name="eye-slash" />
<img
v-else
v-if="user && user.avatar"
:src="user.avatar | proxyApiUrl"
class="image"
:alt="user.name"
:title="user.name"
@error="$event.target.style.display = 'none'"
/>
</div>

View File

@ -0,0 +1,150 @@
import { config, mount } from '@vue/test-utils'
import Vuex from 'vuex'
import helpers from '~/storybook/helpers'
import FollowList from './FollowList.vue'
const localVue = global.localVue
config.stubs['client-only'] = '<span><slot /></span>'
config.stubs['ds-space'] = '<span><slot /></span>'
config.stubs['nuxt-link'] = '<span><slot /></span>'
const user = {
...helpers.fakeUser()[0],
followedByCount: 12,
followingCount: 15,
followedBy: helpers.fakeUser(7),
following: helpers.fakeUser(7),
}
const allConnectionsUser = {
...user,
followedBy: [
...user.followedBy,
...helpers.fakeUser(user.followedByCount - user.followedBy.length),
],
following: [...user.following, ...helpers.fakeUser(user.followingCount - user.following.length)],
}
const noConnectionsUser = {
...user,
followedByCount: 0,
followingCount: 0,
followedBy: [],
following: [],
}
describe('FollowList.vue', () => {
let store, getters
const Wrapper = (customProps) =>
mount(FollowList, {
store,
propsData: { user, ...customProps },
mocks: {
$t: jest.fn((str) => str),
},
localVue,
})
beforeAll(() => {
getters = {
'auth/user': () => {
return {}
},
'auth/isModerator': () => false,
}
})
describe('mount', () => {
beforeAll(() => {
store = new Vuex.Store({
getters,
})
})
describe('given a type', () => {
describe('of `following`', () => {
it('uses the `following` data on :user', () => {
const wrapper = Wrapper({ user, type: 'following' })
wrapper.find('.base-button').trigger('click')
expect(wrapper.vm.allConnectionsCount).toBe(user.followingCount)
expect(wrapper.findAll('.user-teaser')).toHaveLength(user.following.length)
expect(wrapper.emitted('fetchAllConnections')).toEqual([['following']])
})
})
describe('of `followedBy`', () => {
it('uses the `followedBy` data on :user', () => {
const wrapper = Wrapper({ type: 'followedBy' })
wrapper.find('.base-button').trigger('click')
expect(wrapper.vm.allConnectionsCount).toBe(user.followedByCount)
expect(wrapper.findAll('.user-teaser')).toHaveLength(user.followedBy.length)
expect(wrapper.emitted('fetchAllConnections')).toEqual([['followedBy']])
})
})
})
describe('given no type', () => {
it('defaults type to `following`', () => {
const wrapper = Wrapper()
expect(wrapper.text()).toContain('profile.network.following')
})
})
describe('given a user', () => {
describe('without connections', () => {
it('displays the followingNobody message', () => {
const wrapper = Wrapper({ user: noConnectionsUser })
expect(wrapper.find('.nobody-message').text()).toContain(
'profile.network.followingNobody',
)
})
it('displays the followedByNobody message', () => {
const wrapper = Wrapper({ user: noConnectionsUser, type: 'followedBy' })
expect(wrapper.find('.nobody-message').text()).toContain(
'profile.network.followedByNobody',
)
})
})
describe('with up to 7 loaded connections', () => {
let wrapper
beforeAll(() => {
wrapper = Wrapper()
})
it(`renders the connections`, () => {
expect(wrapper.findAll('.user-teaser')).toHaveLength(user.following.length)
})
it(`has a button to load all remaining connections`, async () => {
wrapper.find('.base-button').trigger('click')
expect(wrapper.emitted('fetchAllConnections')).toBeTruthy()
})
})
describe('with more than 7 loaded connections', () => {
let wrapper
beforeAll(() => {
wrapper = Wrapper({ user: allConnectionsUser })
})
it('renders the connections', () => {
expect(wrapper.findAll('.user-teaser')).toHaveLength(allConnectionsUser.followingCount)
})
it('renders the user-teasers as an overflowing list', () => {
expect(wrapper.find('.--overflow').is('ul')).toBe(true)
})
it('renders a filter text input', () => {
expect(wrapper.find('[name="followingFilter"]').is('input')).toBe(true)
})
})
})
})
})

View File

@ -0,0 +1,111 @@
import { storiesOf } from '@storybook/vue'
import { withA11y } from '@storybook/addon-a11y'
import { action } from '@storybook/addon-actions'
import helpers from '~/storybook/helpers'
import FollowList from './FollowList.vue'
import fuzzyFilterUser from './FollowList.story.json'
helpers.init()
const user = {
name: 'Jenny Rostock',
id: 'u3',
followedByCount: 12,
followedBy: helpers.fakeUser(7),
followingCount: 28,
following: helpers.fakeUser(7),
}
const lessThanSevenUser = {
...user,
followedByCount: 3,
followedBy: user.followedBy.slice(0, 3),
followingCount: 3,
following: user.following.slice(0, 3),
}
const allConnectionsUser = {
...user,
followedBy: [...user.followedBy, ...helpers.fakeUser(5)],
following: [...user.following, ...helpers.fakeUser(21)],
}
const noConnectionsUser = {
...user,
followedBy: [],
followedByCount: 0,
following: [],
followingCount: 0,
}
storiesOf('FollowList', module)
.addDecorator(withA11y)
.addDecorator(helpers.layout)
.add('without connections', () => {
return {
components: { FollowList },
store: helpers.store,
data() {
return { user: noConnectionsUser }
},
template: '<follow-list :user="user" type="following" />',
}
})
.add('with all connections loaded', () => {
return {
components: { FollowList },
store: helpers.store,
data() {
return { user: lessThanSevenUser }
},
template: '<follow-list :user="user"/>',
}
})
.add('with more connections loadable', () => {
return {
components: { FollowList },
store: helpers.store,
data() {
return { user: { ...user } }
},
methods: {
fetchAllConnections(type) {
this.user[type] = allConnectionsUser[type]
action('fetchAllConnections')(type, this.user)
},
},
template: '<follow-list :user="user" @fetchAllConnections="fetchAllConnections"/>',
}
})
.add('with 1000 connections loaded', () => {
return {
components: { FollowList },
store: helpers.store,
data() {
return {
user: {
...user,
followedByCount: 1000,
followingCount: 1000,
followedBy: helpers.fakeUser(1000),
following: helpers.fakeUser(1000),
},
}
},
template: '<follow-list :user="user" />',
}
})
.add('Fuzzy Filter', () => {
return {
components: { FollowList },
store: helpers.store,
data() {
return { user: fuzzyFilterUser }
},
template: '<follow-list :user="user" />',
}
})

View File

@ -0,0 +1,519 @@
{
"id": "u3",
"slug": "jenny-rostock",
"name": "Jenny Rostock",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/nessoila/128.jpg?random=16aba55f-48c6-4ef5-966a-af0e31693e6a"
},
"followedByCount": 32,
"followingCount": 31,
"following": [
{
"id": "8c0b0191-454a-4806-b0c3-1ed1d9dc5416",
"slug": "wanda-stanton-sr",
"name": "Wanda Stanton Sr.",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolasfolliot/128.jpg?random=be2e59fb-f038-44d5-9e21-28fb123e8c7c"
}
},
{
"id": "6f4fdb51-fe93-4373-bf44-c36ea17f6535",
"slug": "walter-ohara",
"name": "Walter O'Hara",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/mutlu82/128.jpg?random=0866e1b7-8285-4eaf-a4c8-8509bd99f172"
}
},
{
"id": "20f5080b-1fc2-4c70-94c7-badbe2aa2370",
"slug": "hannah-bradtke",
"name": "Hannah Bradtke",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/Skyhartman/128.jpg?random=c02415a6-1e7e-488a-acb6-47587399ff07"
}
},
{
"id": "c5d2c492-5b8c-41a5-a9a2-26f8c866a885",
"slug": "georgia-koss-dvm",
"name": "Georgia Koss DVM",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/lvovenok/128.jpg?random=8e1e75b9-5dad-4fc8-9c52-38b89a3e0484"
}
},
{
"id": "f4c10451-f367-4afb-97fe-e48f60236655",
"slug": "genevieve-aufderhar-v",
"name": "Genevieve Aufderhar V",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dss49/128.jpg?random=fc59a664-d2b4-4677-81e9-26ed5d4bc37e"
}
},
{
"id": "df65a474-b661-4fd8-b49f-2d609bfc4089",
"slug": "wanda-gerlach",
"name": "Wanda Gerlach",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/lewisainslie/128.jpg?random=5f0976d5-7871-4606-a416-6b67b0e67c15"
}
},
{
"id": "5f2b3c14-07fc-4dfa-978e-9bf21d8586d0",
"slug": "roland-kohler",
"name": "Roland Kohler",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/bcrad/128.jpg?random=4f77c5b2-0214-4342-a18e-424787f04896"
}
},
{
"id": "a2c49c22-940a-4598-8285-b8ebb34bd045",
"slug": "krista-hammes-dvm",
"name": "Krista Hammes DVM",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/sterlingrules/128.jpg?random=28167137-eee4-42e6-98a3-ec9a7d4b9509"
}
},
{
"id": "da70bae8-daf2-4481-b2db-506d00b73210",
"slug": "miss-lester-kovacek",
"name": "Miss Lester Kovacek",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/stefvdham/128.jpg?random=7de26019-8114-4caa-9aea-2172ae3c537c"
}
},
{
"id": "868952d8-c5df-4415-a0bb-930acd26749c",
"slug": "teri-stamm-iii",
"name": "Teri Stamm III",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/salimianoff/128.jpg?random=d2305511-39b2-4207-bee6-90799557546e"
}
},
{
"id": "7a569786-fbb1-4e27-8f2c-38d2a0963b9d",
"slug": "gerardo-batz",
"name": "Gerardo Batz",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/colirpixoil/128.jpg?random=8536b980-103e-4e5e-8141-31142e3c6330"
}
},
{
"id": "dca673f2-89b8-46cc-a836-2515f319c02f",
"slug": "carlton-botsford",
"name": "Carlton Botsford",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/cocolero/128.jpg?random=3ef57800-7694-4ec4-a9eb-39abca8d59e4"
}
},
{
"id": "58ba4ab0-990e-4f44-a7a8-42d10962f8b7",
"slug": "edward-boehm",
"name": "Edward Boehm",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/d_nny_m_cher/128.jpg?random=cf3ba671-4564-4dc1-bf94-a5fc3ea4fafa"
}
},
{
"id": "u4",
"slug": "huey",
"name": "Huey",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/hellofeverrrr/128.jpg?random=46fef3a9-44a0-4784-9854-03be6b3f37e1"
}
},
{
"id": "40cf7e21-a4dc-4055-a49d-3137c53dd815",
"slug": "ms-laurie-bergnaum",
"name": "Ms. Laurie Bergnaum",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/kohette/128.jpg?random=45516cde-9073-4ceb-8b42-2bdf66a26c67"
}
},
{
"id": "4c377f54-72c3-4e13-9532-6d0f2278a794",
"slug": "jeffery-waelchi",
"name": "Jeffery Waelchi",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/128.jpg?random=b643d8ba-5e49-4854-b2a6-2ff609ffcba0"
}
},
{
"id": "d861e775-2344-40d5-b6e4-8479e7dbe97f",
"slug": "marvin-gutkowski-iii",
"name": "Marvin Gutkowski III",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/kiwiupover/128.jpg?random=d38c1508-0342-46e0-9ef9-e0fd14b33072"
}
},
{
"id": "3102346c-ea94-41d3-8474-5241e5e473a6",
"slug": "edmund-rolfson-jr",
"name": "Edmund Rolfson Jr.",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg?random=d6f0804c-f38f-4c8b-821d-27a02373c74e"
}
},
{
"id": "0290fd5e-7ce8-4d70-8c29-f5ed96bfaa1f",
"slug": "bert-oconner",
"name": "Bert O'Conner",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/mangosango/128.jpg?random=03807c6c-c2f6-4ed3-8433-7a1823079eb0"
}
},
{
"id": "9fe670ff-1968-4b15-ab80-7adee8173dd8",
"slug": "angela-schiller",
"name": "Angela Schiller",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dudestein/128.jpg?random=0b511fa4-8603-419a-acf0-2a89bc41a71b"
}
},
{
"id": "63798c79-2476-4eb8-a09c-167420bd05d7",
"slug": "peggy-carter",
"name": "Peggy Carter",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/uxpiper/128.jpg?random=c4dc0de5-99d7-410d-8088-6a2be8358fe9"
}
},
{
"id": "4d3fbb67-7ddc-4aa9-96d0-57bb20f95f59",
"slug": "krystal-braun",
"name": "Krystal Braun",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/salvafc/128.jpg?random=1dbd4549-a525-4fa3-be41-15db84ceb41a"
}
},
{
"id": "bcd5f271-bca5-492e-a6b6-7fd490ac37aa",
"slug": "janet-bruen",
"name": "Janet Bruen",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/yigitpinarbasi/128.jpg?random=3c7ab2c0-8e53-4edb-8c74-fd8cdfae5f8e"
}
},
{
"id": "38ccbf58-305a-4400-a1e4-785661604d5f",
"slug": "ebony-corwin",
"name": "Ebony Corwin",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/128.jpg?random=f2137643-6f58-45b8-8266-d1fb893d0528"
}
},
{
"id": "5137e045-aef0-4ce1-8327-b516a72fffd6",
"slug": "terrell-gorczany",
"name": "Terrell Gorczany",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg?random=5e61976f-529e-47f2-b4f0-b5e4550942ea"
}
},
{
"id": "b224eb01-5a71-4126-b811-51b7b35afd51",
"slug": "dr-jamie-romaguera",
"name": "Dr. Jamie Romaguera",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/leonfedotov/128.jpg?random=9179538d-58be-4707-8ad6-485f703bea26"
}
},
{
"id": "fdbb3e7f-f211-4685-831e-9d7e394b95a1",
"slug": "shannon-schuster",
"name": "Shannon Schuster",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg?random=f8a223ff-d49f-499f-a161-350e8078c353"
}
},
{
"id": "d7ee00ea-5d22-4a1c-8670-7e4d4bd4ebfa",
"slug": "guadalupe-kessler",
"name": "Guadalupe Kessler",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/128.jpg?random=a87d13e1-ff0e-4a39-a018-e89a04d72572"
}
},
{
"id": "49b868e3-dba5-48ed-8b6c-e686c70dfcfb",
"slug": "lonnie-rogahn",
"name": "Lonnie Rogahn",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/herbigt/128.jpg?random=fde8a699-624d-4052-96ef-0aaacf217184"
}
},
{
"id": "fa70eecb-fbae-4133-b447-6c80b335fc01",
"slug": "marcella-ledner",
"name": "Marcella Ledner",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dawidwu/128.jpg?random=03869abc-1a6b-4f26-8d73-7ba508c148d0"
}
},
{
"id": "ef4cc540-c784-407f-b646-cff4d8fe666e",
"slug": "darrell-runolfsson",
"name": "Darrell Runolfsson",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/andrewofficer/128.jpg?random=e6c24db9-f1c9-45b5-8507-609fca960e92"
}
}
],
"followedBy": [
{
"id": "8c0b0191-454a-4806-b0c3-1ed1d9dc5416",
"slug": "wanda-stanton-sr",
"name": "Wanda Stanton Sr.",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/nicolasfolliot/128.jpg?random=be2e59fb-f038-44d5-9e21-28fb123e8c7c"
}
},
{
"id": "c5d2c492-5b8c-41a5-a9a2-26f8c866a885",
"slug": "georgia-koss-dvm",
"name": "Georgia Koss DVM",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/lvovenok/128.jpg?random=8e1e75b9-5dad-4fc8-9c52-38b89a3e0484"
}
},
{
"id": "5f2b3c14-07fc-4dfa-978e-9bf21d8586d0",
"slug": "roland-kohler",
"name": "Roland Kohler",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/bcrad/128.jpg?random=4f77c5b2-0214-4342-a18e-424787f04896"
}
},
{
"id": "6f4fdb51-fe93-4373-bf44-c36ea17f6535",
"slug": "walter-ohara",
"name": "Walter O'Hara",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/mutlu82/128.jpg?random=0866e1b7-8285-4eaf-a4c8-8509bd99f172"
}
},
{
"id": "20f5080b-1fc2-4c70-94c7-badbe2aa2370",
"slug": "hannah-bradtke",
"name": "Hannah Bradtke",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/Skyhartman/128.jpg?random=c02415a6-1e7e-488a-acb6-47587399ff07"
}
},
{
"id": "df65a474-b661-4fd8-b49f-2d609bfc4089",
"slug": "wanda-gerlach",
"name": "Wanda Gerlach",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/lewisainslie/128.jpg?random=5f0976d5-7871-4606-a416-6b67b0e67c15"
}
},
{
"id": "f4c10451-f367-4afb-97fe-e48f60236655",
"slug": "genevieve-aufderhar-v",
"name": "Genevieve Aufderhar V",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dss49/128.jpg?random=fc59a664-d2b4-4677-81e9-26ed5d4bc37e"
}
},
{
"id": "7a569786-fbb1-4e27-8f2c-38d2a0963b9d",
"slug": "gerardo-batz",
"name": "Gerardo Batz",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/colirpixoil/128.jpg?random=8536b980-103e-4e5e-8141-31142e3c6330"
}
},
{
"id": "da70bae8-daf2-4481-b2db-506d00b73210",
"slug": "miss-lester-kovacek",
"name": "Miss Lester Kovacek",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/stefvdham/128.jpg?random=7de26019-8114-4caa-9aea-2172ae3c537c"
}
},
{
"id": "a2c49c22-940a-4598-8285-b8ebb34bd045",
"slug": "krista-hammes-dvm",
"name": "Krista Hammes DVM",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/sterlingrules/128.jpg?random=28167137-eee4-42e6-98a3-ec9a7d4b9509"
}
},
{
"id": "bcd5f271-bca5-492e-a6b6-7fd490ac37aa",
"slug": "janet-bruen",
"name": "Janet Bruen",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/yigitpinarbasi/128.jpg?random=3c7ab2c0-8e53-4edb-8c74-fd8cdfae5f8e"
}
},
{
"id": "38ccbf58-305a-4400-a1e4-785661604d5f",
"slug": "ebony-corwin",
"name": "Ebony Corwin",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/thibaut_re/128.jpg?random=f2137643-6f58-45b8-8266-d1fb893d0528"
}
},
{
"id": "d7ee00ea-5d22-4a1c-8670-7e4d4bd4ebfa",
"slug": "guadalupe-kessler",
"name": "Guadalupe Kessler",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/linux29/128.jpg?random=a87d13e1-ff0e-4a39-a018-e89a04d72572"
}
},
{
"id": "dca673f2-89b8-46cc-a836-2515f319c02f",
"slug": "carlton-botsford",
"name": "Carlton Botsford",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/cocolero/128.jpg?random=3ef57800-7694-4ec4-a9eb-39abca8d59e4"
}
},
{
"id": "49b868e3-dba5-48ed-8b6c-e686c70dfcfb",
"slug": "lonnie-rogahn",
"name": "Lonnie Rogahn",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/herbigt/128.jpg?random=fde8a699-624d-4052-96ef-0aaacf217184"
}
},
{
"id": "4d3fbb67-7ddc-4aa9-96d0-57bb20f95f59",
"slug": "krystal-braun",
"name": "Krystal Braun",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/salvafc/128.jpg?random=1dbd4549-a525-4fa3-be41-15db84ceb41a"
}
},
{
"id": "58ba4ab0-990e-4f44-a7a8-42d10962f8b7",
"slug": "edward-boehm",
"name": "Edward Boehm",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/d_nny_m_cher/128.jpg?random=cf3ba671-4564-4dc1-bf94-a5fc3ea4fafa"
}
},
{
"id": "868952d8-c5df-4415-a0bb-930acd26749c",
"slug": "teri-stamm-iii",
"name": "Teri Stamm III",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/salimianoff/128.jpg?random=d2305511-39b2-4207-bee6-90799557546e"
}
},
{
"id": "fa70eecb-fbae-4133-b447-6c80b335fc01",
"slug": "marcella-ledner",
"name": "Marcella Ledner",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dawidwu/128.jpg?random=03869abc-1a6b-4f26-8d73-7ba508c148d0"
}
},
{
"id": "63798c79-2476-4eb8-a09c-167420bd05d7",
"slug": "peggy-carter",
"name": "Peggy Carter",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/uxpiper/128.jpg?random=c4dc0de5-99d7-410d-8088-6a2be8358fe9"
}
},
{
"id": "9fe670ff-1968-4b15-ab80-7adee8173dd8",
"slug": "angela-schiller",
"name": "Angela Schiller",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/dudestein/128.jpg?random=0b511fa4-8603-419a-acf0-2a89bc41a71b"
}
},
{
"id": "fdbb3e7f-f211-4685-831e-9d7e394b95a1",
"slug": "shannon-schuster",
"name": "Shannon Schuster",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg?random=f8a223ff-d49f-499f-a161-350e8078c353"
}
},
{
"id": "5137e045-aef0-4ce1-8327-b516a72fffd6",
"slug": "terrell-gorczany",
"name": "Terrell Gorczany",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/jimmuirhead/128.jpg?random=5e61976f-529e-47f2-b4f0-b5e4550942ea"
}
},
{
"id": "ef4cc540-c784-407f-b646-cff4d8fe666e",
"slug": "darrell-runolfsson",
"name": "Darrell Runolfsson",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/andrewofficer/128.jpg?random=e6c24db9-f1c9-45b5-8507-609fca960e92"
}
},
{
"id": "b224eb01-5a71-4126-b811-51b7b35afd51",
"slug": "dr-jamie-romaguera",
"name": "Dr. Jamie Romaguera",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/leonfedotov/128.jpg?random=9179538d-58be-4707-8ad6-485f703bea26"
}
},
{
"id": "u1",
"slug": "peter-lustig",
"name": "Peter Lustig",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/timgthomas/128.jpg?random=189d17f8-02d1-4b01-a000-af7121ae6897"
}
},
{
"id": "u6",
"slug": "louie",
"name": "Louie",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/yayteejay/128.jpg?random=eefe597c-d49a-494f-b311-d6f2645d2264"
}
},
{
"id": "3102346c-ea94-41d3-8474-5241e5e473a6",
"slug": "edmund-rolfson-jr",
"name": "Edmund Rolfson Jr.",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg?random=d6f0804c-f38f-4c8b-821d-27a02373c74e"
}
},
{
"id": "40cf7e21-a4dc-4055-a49d-3137c53dd815",
"slug": "ms-laurie-bergnaum",
"name": "Ms. Laurie Bergnaum",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/kohette/128.jpg?random=45516cde-9073-4ceb-8b42-2bdf66a26c67"
}
},
{
"id": "d861e775-2344-40d5-b6e4-8479e7dbe97f",
"slug": "marvin-gutkowski-iii",
"name": "Marvin Gutkowski III",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/kiwiupover/128.jpg?random=d38c1508-0342-46e0-9ef9-e0fd14b33072"
}
},
{
"id": "4c377f54-72c3-4e13-9532-6d0f2278a794",
"slug": "jeffery-waelchi",
"name": "Jeffery Waelchi",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/andresenfredrik/128.jpg?random=b643d8ba-5e49-4854-b2a6-2ff609ffcba0"
}
},
{
"id": "0290fd5e-7ce8-4d70-8c29-f5ed96bfaa1f",
"slug": "bert-oconner",
"name": "Bert O'Conner",
"avatar": {
"url": "https://s3.amazonaws.com/uifaces/faces/twitter/mangosango/128.jpg?random=03807c6c-c2f6-4ed3-8433-7a1823079eb0"
}
}
]
}

View File

@ -0,0 +1,165 @@
<template>
<base-card class="follow-list">
<template v-if="connections && connections.length">
<h5 class="title spacer-x-small">
{{ userName | truncate(15) }} {{ $t(`profile.network.${type}`) }}
</h5>
<ul :class="connectionsClass">
<li
v-for="connection in filteredConnections"
:key="connection.id"
class="connections__item"
>
<user-teaser :user="connection" />
</li>
</ul>
<base-button
v-if="hasMore"
:loading="loading"
class="spacer-x-small"
size="small"
@click="$emit('fetchAllConnections', type)"
>
{{
$t('profile.network.andMore', {
number: allConnectionsCount - connections.length,
})
}}
</base-button>
<ds-input
v-if="!hasMore"
v-focus="true"
:name="`${type}Filter`"
:placeholder="filter"
class="spacer-x-small"
icon="filter"
size="small"
@input.native="setFilter"
/>
</template>
<p v-else class="nobody-message">{{ userName }} {{ $t(`profile.network.${type}Nobody`) }}</p>
</base-card>
</template>
<script>
import { escape } from 'xregexp/xregexp-all.js'
import UserTeaser from '~/components/UserTeaser/UserTeaser'
export default {
name: 'FollowerList',
components: {
UserTeaser,
},
props: {
user: { type: Object, default: null },
type: { type: String, default: 'following' },
loading: { type: Boolean, default: false },
},
data() {
return {
filter: null,
}
},
computed: {
userName() {
const { name } = this.user || {}
return name || this.$t('profile.userAnonym')
},
allConnectionsCount() {
return this.user[`${this.type}Count`]
},
connections() {
return this.user[this.type]
},
hasMore() {
return this.allConnectionsCount > this.connections.length
},
connectionsClass() {
return `connections${this.hasMore ? '' : ' --overflow'}`
},
filteredConnections() {
if (!this.filter) {
return this.connections
}
// @example
// this.filter = 'foo';
// fuzzyExpression = /([^f]*f)([^o]*o)([^o]*o)/i
const fuzzyExpression = new RegExp(
`${this.filter.split('').reduce((expr, c) => `${expr}([^${escape(c)}]*${escape(c)})`, '')}`,
'i',
)
const fuzzyScores = this.connections
.map((user) => {
const match = user.name.match(fuzzyExpression)
if (!match) {
return false
}
let score = 1
for (let i = 1; i <= this.filter.length; i++) {
score *= match[i].length
}
return {
user,
score,
}
})
.filter(Boolean)
.sort((a, b) => a.score - b.score)
return fuzzyScores.map((score) => score.user)
},
},
methods: {
setFilter(evt) {
this.filter = evt.target.value
},
},
}
</script>
<style lang="scss">
.follow-list {
display: flex;
flex-direction: column;
position: relative;
width: auto;
> .title {
color: $text-color-soft;
font-size: $font-size-base;
}
.connections {
height: $size-height-connections;
padding: $space-none;
list-style-type: none;
&.--overflow {
overflow-y: auto;
}
> .connections__item {
padding: $space-xx-small;
&.is-selected,
&:hover {
background-color: $background-color-primary-inverse;
}
}
}
.nobody-message {
text-align: center;
color: $text-color-soft;
}
> :nth-child(n):not(:last-child) {
margin-bottom: $space-small;
}
}
</style>

View File

@ -14,7 +14,7 @@ export default (i18n) => {
${userCountsFragment}
${locationAndBadgesFragment(lang)}
query User($id: ID!) {
query User($id: ID!, $followedByCount: Int, $followingCount: Int) {
User(id: $id) {
...user
...userCounts
@ -26,12 +26,12 @@ export default (i18n) => {
isMuted
isBlocked
blocked
following(first: 7) {
following(first: $followingCount) {
...user
...userCounts
...locationAndBadges
}
followedBy(first: 7) {
followedBy(first: $followedByCount) {
...user
...userCounts
...locationAndBadges

View File

@ -71,7 +71,7 @@
"cookie-universal-nuxt": "~2.1.3",
"cropperjs": "^1.5.5",
"cross-env": "~7.0.2",
"date-fns": "2.11.1",
"date-fns": "2.12.0",
"express": "~4.17.1",
"graphql": "~14.6.0",
"jsonwebtoken": "~8.5.1",
@ -111,12 +111,12 @@
"async-validator": "^3.2.4",
"babel-core": "~7.0.0-bridge.0",
"babel-eslint": "~10.1.0",
"babel-jest": "~25.2.6",
"babel-jest": "~25.3.0",
"babel-loader": "~8.1.0",
"babel-plugin-require-context-hook": "^1.0.0",
"babel-preset-vue": "~2.0.2",
"core-js": "~2.6.10",
"css-loader": "~3.5.1",
"css-loader": "~3.5.2",
"eslint": "~6.8.0",
"eslint-config-prettier": "~6.10.1",
"eslint-config-standard": "~14.1.1",
@ -131,7 +131,7 @@
"faker": "^4.1.0",
"flush-promises": "^1.0.2",
"identity-obj-proxy": "^3.0.0",
"jest": "~25.2.7",
"jest": "~25.3.0",
"mutation-observer": "^1.0.3",
"node-sass": "~4.13.1",
"prettier": "~2.0.4",

View File

@ -9,6 +9,7 @@ config.stubs['client-only'] = '<span><slot /></span>'
config.stubs['v-popover'] = '<span><slot /></span>'
config.stubs['nuxt-link'] = '<span><slot /></span>'
config.stubs['infinite-loading'] = '<span><slot /></span>'
config.stubs['follow-list'] = '<span><slot /></span>'
describe('ProfileSlug', () => {
let wrapper

View File

@ -89,65 +89,19 @@
<ds-heading tag="h3" soft style="text-align: center; margin-bottom: 10px;">
{{ $t('profile.network.title') }}
</ds-heading>
<base-card style="position: relative; height: auto;">
<ds-space v-if="user.following && user.following.length" margin="x-small">
<ds-text tag="h5" color="soft">
{{ userName | truncate(15) }} {{ $t('profile.network.following') }}
</ds-text>
</ds-space>
<template v-if="user.following && user.following.length">
<ds-space v-for="follow in uniq(user.following)" :key="follow.id" margin="x-small">
<!-- TODO: find better solution for rendering errors -->
<client-only>
<user-teaser :user="follow" />
</client-only>
</ds-space>
<ds-space v-if="user.followingCount - user.following.length" margin="small">
<ds-text size="small" color="softer">
{{
$t('profile.network.andMore', {
number: user.followingCount - user.following.length,
})
}}
</ds-text>
</ds-space>
</template>
<template v-else>
<p style="text-align: center; opacity: 0.5;">
{{ userName }} {{ $t('profile.network.followingNobody') }}
</p>
</template>
</base-card>
<follow-list
:loading="$apollo.loading"
:user="user"
type="followedBy"
@fetchAllConnections="fetchAllConnections"
/>
<ds-space />
<base-card style="position: relative; height: auto;">
<ds-space v-if="user.followedBy && user.followedBy.length" margin="x-small">
<ds-text tag="h5" color="soft">
{{ userName | truncate(15) }} {{ $t('profile.network.followedBy') }}
</ds-text>
</ds-space>
<template v-if="user.followedBy && user.followedBy.length">
<ds-space v-for="follow in uniq(user.followedBy)" :key="follow.id" margin="x-small">
<!-- TODO: find better solution for rendering errors -->
<client-only>
<user-teaser :user="follow" />
</client-only>
</ds-space>
<ds-space v-if="user.followedByCount - user.followedBy.length" margin="small">
<ds-text size="small" color="softer">
{{
$t('profile.network.andMore', {
number: user.followedByCount - user.followedBy.length,
})
}}
</ds-text>
</ds-space>
</template>
<template v-else>
<p style="text-align: center; opacity: 0.5;">
{{ userName }} {{ $t('profile.network.followedByNobody') }}
</p>
</template>
</base-card>
<follow-list
:loading="$apollo.loading"
:user="user"
type="following"
@fetchAllConnections="fetchAllConnections"
/>
<ds-space v-if="user.socialMedia && user.socialMedia.length" margin="large">
<base-card style="position: relative; height: auto;">
<ds-space margin="x-small">
@ -271,11 +225,11 @@
<script>
import uniqBy from 'lodash/uniqBy'
import UserTeaser from '~/components/UserTeaser/UserTeaser'
import PostTeaser from '~/components/PostTeaser/PostTeaser.vue'
import HcFollowButton from '~/components/FollowButton.vue'
import HcCountTo from '~/components/CountTo.vue'
import HcBadges from '~/components/Badges.vue'
import FollowList from '~/components/features/FollowList/FollowList'
import HcEmpty from '~/components/Empty/Empty'
import ContentMenu from '~/components/ContentMenu/ContentMenu'
import HcUpload from '~/components/Upload'
@ -299,7 +253,6 @@ const tabToFilterMapping = ({ tab, id }) => {
export default {
components: {
UserTeaser,
PostTeaser,
HcFollowButton,
HcCountTo,
@ -310,6 +263,7 @@ export default {
HcUpload,
MasonryGrid,
MasonryGridItem,
FollowList,
},
transition: {
name: 'slide-up',
@ -326,6 +280,8 @@ export default {
tabActive: 'post',
filter,
followedByCountStartValue: 0,
followedByCount: 7,
followingCount: 7,
}
},
computed: {
@ -355,13 +311,6 @@ export default {
return slug && `@${slug}`
},
},
watch: {
User(val) {
if (!val || !val.length) {
throw new Error('User not found!')
}
},
},
methods: {
removePostFromList(deletedPost) {
this.posts = this.posts.filter((post) => {
@ -483,6 +432,10 @@ export default {
this.user.followedByCurrentUser = followedByCurrentUser
this.user.followedBy = followedBy
},
fetchAllConnections(type) {
if (type === 'following') this.followingCount = Infinity
if (type === 'followedBy') this.followedByCount = Infinity
},
},
apollo: {
profilePagePosts: {
@ -507,7 +460,11 @@ export default {
return UserQuery(this.$i18n)
},
variables() {
return { id: this.$route.params.id }
return {
id: this.$route.params.id,
followedByCount: this.followedByCount,
followingCount: this.followingCount,
}
},
fetchPolicy: 'cache-and-network',
},

View File

@ -7,7 +7,10 @@ export default ({ app }) => {
// Focus the element
Vue.nextTick(() => {
if (binding.value !== false) {
el.focus()
const target = el instanceof HTMLInputElement ? el : el.querySelector('input')
if (target) {
target.focus()
}
}
})
},

View File

@ -1,8 +1,10 @@
import Vue from 'vue'
import Vuex from 'vuex'
import faker from 'faker'
import vuexI18n from 'vuex-i18n/dist/vuex-i18n.umd.js'
import Styleguide from '@human-connection/styleguide'
import Filters from '~/plugins/vue-filters'
import Directives from '~/plugins/vue-directives'
import IziToast from '~/plugins/izi-toast'
import layout from './layout.vue'
import locales from '~/locales/index.js'
@ -15,6 +17,7 @@ const helpers = {
Vue.use(Styleguide)
Vue.use(Filters)
Vue.use(IziToast)
Vue.use(Directives)
Vue.use(vuexI18n.plugin, helpers.store)
locales.forEach(({ code }) => {
@ -38,7 +41,7 @@ const helpers = {
isAdmin() {
return true
},
user(state) {
user() {
return { id: '1', name: 'admin', slug: 'admin' }
},
},
@ -57,6 +60,16 @@ const helpers = {
</layout>`,
}
},
fakeUser(n) {
return new Array(n || 1).fill(0).map(() => {
const name = faker.name.findName()
return {
id: faker.random.uuid(),
name,
slug: faker.helpers.slugify(name),
}
})
},
}
export default helpers

View File

@ -1,7 +1,7 @@
<template>
<ds-container class="container">
<div class="container">
<slot />
</ds-container>
</div>
</template>
<style lang="scss">
@ -10,5 +10,7 @@
.container {
padding: 5rem;
max-width: 1200px;
margin: 0 auto;
}
</style>

View File

@ -5,6 +5,7 @@ import Styleguide from '@human-connection/styleguide'
import BaseComponents from '~/plugins/base-components'
import Filters from '~/plugins/vue-filters'
import InfiniteLoading from '~/plugins/vue-infinite-loading'
import Directives from '~/plugins/vue-directives'
global.localVue = createLocalVue()
@ -13,4 +14,5 @@ global.localVue.use(VTooltip)
global.localVue.use(Styleguide)
global.localVue.use(BaseComponents)
global.localVue.use(Filters)
global.localVue.use(Directives)
global.localVue.use(InfiniteLoading)

File diff suppressed because it is too large Load Diff

View File

@ -1082,10 +1082,10 @@
dependencies:
"@hapi/hoek" "8.x.x"
"@jest/types@^25.2.6":
version "25.2.6"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6"
integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==
"@jest/types@^25.3.0":
version "25.3.0"
resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7"
integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==
dependencies:
"@types/istanbul-lib-coverage" "^2.0.0"
"@types/istanbul-reports" "^1.1.1"
@ -2639,10 +2639,10 @@ date-fns@^1.27.2:
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
date-fns@^2.11.1:
version "2.11.1"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12"
integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==
date-fns@^2.12.0:
version "2.12.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.12.0.tgz#01754c8a2f3368fc1119cf4625c3dad8c1845ee6"
integrity sha512-qJgn99xxKnFgB1qL4jpxU7Q2t0LOn1p8KMIveef3UZD7kqjT3tpFNNdXJelEHhE+rUgffriXriw/sOSU+cS1Hw==
date-now@^0.1.4:
version "0.1.4"
@ -3047,16 +3047,16 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
expect@^25.2.7:
version "25.2.7"
resolved "https://registry.yarnpkg.com/expect/-/expect-25.2.7.tgz#509b79f47502835f4071ff3ecc401f2eaecca709"
integrity sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==
expect@^25.3.0:
version "25.3.0"
resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71"
integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==
dependencies:
"@jest/types" "^25.2.6"
"@jest/types" "^25.3.0"
ansi-styles "^4.0.0"
jest-get-type "^25.2.6"
jest-matcher-utils "^25.2.7"
jest-message-util "^25.2.6"
jest-matcher-utils "^25.3.0"
jest-message-util "^25.3.0"
jest-regex-util "^25.2.6"
extend-shallow@^2.0.1:
@ -3993,38 +3993,38 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jest-diff@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7"
integrity sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==
jest-diff@^25.3.0:
version "25.3.0"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f"
integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==
dependencies:
chalk "^3.0.0"
diff-sequences "^25.2.6"
jest-get-type "^25.2.6"
pretty-format "^25.2.6"
pretty-format "^25.3.0"
jest-get-type@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
jest-matcher-utils@^25.2.7:
version "25.2.7"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz#53fad3c11fc42e92e374306df543026712c957a3"
integrity sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==
jest-matcher-utils@^25.3.0:
version "25.3.0"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648"
integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==
dependencies:
chalk "^3.0.0"
jest-diff "^25.2.6"
jest-diff "^25.3.0"
jest-get-type "^25.2.6"
pretty-format "^25.2.6"
pretty-format "^25.3.0"
jest-message-util@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.2.6.tgz#9d5523bebec8cd9cdef75f0f3069d6ec9a2252df"
integrity sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==
jest-message-util@^25.3.0:
version "25.3.0"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85"
integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==
dependencies:
"@babel/code-frame" "^7.0.0"
"@jest/types" "^25.2.6"
"@jest/types" "^25.3.0"
"@types/stack-utils" "^1.0.1"
chalk "^3.0.0"
micromatch "^4.0.2"
@ -5320,12 +5320,12 @@ pretty-bytes@5.3.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
pretty-format@^25.2.6:
version "25.2.6"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7"
integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==
pretty-format@^25.3.0:
version "25.3.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5"
integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==
dependencies:
"@jest/types" "^25.2.6"
"@jest/types" "^25.3.0"
ansi-regex "^5.0.0"
ansi-styles "^4.0.0"
react-is "^16.12.0"