From 2a02a3dc07b58e0f2672ecdcfa76005f6382a134 Mon Sep 17 00:00:00 2001 From: mattwr18 Date: Mon, 23 Sep 2019 22:09:00 +0200 Subject: [PATCH 01/19] Configure docker to work with storybook --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 587ec718f..341c66885 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,7 @@ services: - "BUILD_COMMIT=${TRAVIS_COMMIT}" ports: - 3000:3000 + - 3502:3502 networks: - hc-network depends_on: @@ -60,7 +61,6 @@ services: - 7474:7474 volumes: - neo4j_data:/data - networks: hc-network: volumes: From 07508ab4df6b3fcf4d8156391969a080da4780b8 Mon Sep 17 00:00:00 2001 From: mattwr18 Date: Tue, 24 Sep 2019 12:00:58 +0200 Subject: [PATCH 02/19] Add documentation for storybook --- .gitbook/assets/storybook-output.png | Bin 0 -> 50585 bytes CONTRIBUTING.md | 6 ++--- backend/README.md | 36 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 .gitbook/assets/storybook-output.png diff --git a/.gitbook/assets/storybook-output.png b/.gitbook/assets/storybook-output.png new file mode 100644 index 0000000000000000000000000000000000000000..2b157dd62c0fdcd74e92b49a23505d146f36aefb GIT binary patch literal 50585 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¨VF^KrJU$Ih-5usAo1i)JvsFE)T7K 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 literal 0 HcmV?d00001 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0eb90a824..1475df0de 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,17 +50,17 @@ But what do we do when waiting for merge into master \(wanting to keep PRs small * but what about when you are waiting for merge? * solutions * 1\) put 2nd PR into branch that the first PR is hitting - but requires update after merging - * 2\) prefer to leave exiting PR until it can be reviewed, and instead go and work on some other part of the codebase that is not impacted by the first PR + * 2\) prefer to leave existing PR until it can be reviewed, and instead go and work on some other part of the codebase that is not impacted by the first PR ### Code Review * Github setting in place - at least one review is required to merge - in principle anyone (who is not the PR owner) can review - - but often it will be the core developers (Robert, Ulf, Greg, Wolfgang?) + - but often it will be the core developers (Robert, Wolfgang, Matt, Alina, Alex) - once there is a review, and presuming no requested changes, PR opener can merge * CI/tests - the CI needs to pass - - linting <-- autofix? + - linting (yarn lint --fix) - tests (unit, feature) (backend, frontend) - codecoverage diff --git a/backend/README.md b/backend/README.md index cd56e231f..41020116b 100644 --- a/backend/README.md +++ b/backend/README.md @@ -72,6 +72,8 @@ To reset the database run: $ docker-compose exec backend yarn run db:reset # you could also wipe out your neo4j database and delete all volumes with: $ docker-compose down -v +# if container is not running, run this command to set up your database indeces and contstraints +$ docker-compose run neo4j db_setup ``` {% endtab %} @@ -88,6 +90,40 @@ $ yarn run db:reset {% endtab %} {% endtabs %} +### Storybook + +We encourage contributors to use Storybook to test out new components in an isolated way, and benefit from its many features. +See the docs for live examples and answers to FAQ, among other helpful information. ![Storybook docs](https://storybook.js.org/docs/basics/introduction/) + +{% tabs %} +{% tab title="Docker" %} + +After you have started the application following the instructions above, in another terminal run: + +```bash +$ docker-compose exec webapp yarn storybook +``` +The output should look similar to this: + +![Storybook output](../.gitbook/assets/storybook-output.png) + +Click on the link http://172.18.0.6:3002/ to open the browser to your interactive storybook. + +{% endtab %} + +{% tab title="Without Docker" %} +Run the following command: + +```bash +# in webapp/ +yarn storybook +``` + +Open http://localhost:3002/ in your browser + +{% endtab %} +{% endtabs %} + # Testing From 33134c1d4f4b77aca26624f0a7fc7d592ab84bc8 Mon Sep 17 00:00:00 2001 From: aonomike Date: Tue, 24 Sep 2019 23:36:52 +0300 Subject: [PATCH 03/19] Refactor shout spec - Test unauthorized user path --- backend/src/schema/resolvers/shout.spec.js | 156 ++++----------------- 1 file changed, 29 insertions(+), 127 deletions(-) diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index 718a1e169..8cf6c6982 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -1,13 +1,13 @@ -import { GraphQLClient } from 'graphql-request' +import { createTestClient } from 'apollo-server-testing' import Factory from '../../seed/factories' -import { host, login, gql } from '../../jest/helpers' -import { neode } from '../../bootstrap/neo4j' +import { gql } from '../../jest/helpers' +import { neode as getNeode, getDriver } from '../../bootstrap/neo4j' +import createServer from '../../server' -let clientUser1, clientUser2 -let headersUser1, headersUser2 +let mutate, query, authenticatedUser, variables const factory = Factory() -const instance = neode() -const categoryIds = ['cat9'] +const instance = getNeode() +const driver = getDriver() const mutationShoutPost = gql` mutation($id: ID!) { @@ -28,132 +28,34 @@ const createPostMutation = gql` } } ` -const createPostVariables = { - id: 'p1234', - title: 'Post Title 1234', - content: 'Some Post Content 1234', - categoryIds, -} -beforeEach(async () => { - await factory.create('User', { - id: 'u1', - email: 'test@example.org', - password: '1234', +describe('shout and unshout posts', () => { + beforeAll(() => { + authenticatedUser = undefined + const { server } = createServer({ + context: () => { + return { + driver, + neode: instance, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + query = createTestClient(server).query }) - await factory.create('User', { - id: 'u2', - email: 'test2@example.org', - password: '1234', - }) - await instance.create('Category', { - id: 'cat9', - name: 'Democracy & Politics', - icon: 'university', - }) - headersUser1 = await login({ email: 'test@example.org', password: '1234' }) - headersUser2 = await login({ email: 'test2@example.org', password: '1234' }) - clientUser1 = new GraphQLClient(host, { headers: headersUser1 }) - clientUser2 = new GraphQLClient(host, { headers: headersUser2 }) - await clientUser1.request(createPostMutation, createPostVariables) - await clientUser2.request(createPostMutation, { - id: 'p12345', - title: 'Post Title 12345', - content: 'Some Post Content 12345', - categoryIds, + afterEach(() => { + factory.cleanDatabase() }) -}) -afterEach(async () => { - await factory.cleanDatabase() -}) - -describe('shout', () => { - describe('shout foreign post', () => { - describe('unauthenticated shout', () => { + describe('shout', () => { + describe('unauthenticated', () => { it('throws authorization error', async () => { - const client = new GraphQLClient(host) - await expect(client.request(mutationShoutPost, { id: 'p1234' })).rejects.toThrow( - 'Not Authorised', - ) + variables = { id: 'post-to-shout-id' } + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorised!' }], + }) }) }) - - it('I shout a post of another user', async () => { - const res = await clientUser1.request(mutationShoutPost, { id: 'p12345' }) - const expected = { - shout: true, - } - expect(res).toMatchObject(expected) - - const { Post } = await clientUser1.request(gql` - query { - Post(id: "p12345") { - shoutedByCurrentUser - } - } - `) - const expected2 = { - shoutedByCurrentUser: true, - } - expect(Post[0]).toMatchObject(expected2) - }) - - it('I can`t shout my own post', async () => { - const res = await clientUser1.request(mutationShoutPost, { id: 'p1234' }) - const expected = { - shout: false, - } - expect(res).toMatchObject(expected) - - const { Post } = await clientUser1.request(gql` - query { - Post(id: "p1234") { - shoutedByCurrentUser - } - } - `) - const expected2 = { - shoutedByCurrentUser: false, - } - expect(Post[0]).toMatchObject(expected2) - }) - }) - - describe('unshout foreign post', () => { - describe('unauthenticated shout', () => { - it('throws authorization error', async () => { - // shout - await clientUser1.request(mutationShoutPost, { id: 'p12345' }) - // unshout - const client = new GraphQLClient(host) - await expect(client.request(mutationUnshoutPost, { id: 'p12345' })).rejects.toThrow( - 'Not Authorised', - ) - }) - }) - - it('I unshout a post of another user', async () => { - // shout - await clientUser1.request(mutationShoutPost, { id: 'p12345' }) - const expected = { - unshout: true, - } - // unshout - const res = await clientUser1.request(mutationUnshoutPost, { id: 'p12345' }) - expect(res).toMatchObject(expected) - - const { Post } = await clientUser1.request(gql` - query { - Post(id: "p12345") { - shoutedByCurrentUser - } - } - `) - const expected2 = { - shoutedByCurrentUser: false, - } - expect(Post[0]).toMatchObject(expected2) - }) }) }) From 4488008a2c8974ccbc674c6295a083a4b68e6f99 Mon Sep 17 00:00:00 2001 From: aonomike Date: Wed, 25 Sep 2019 01:11:18 +0300 Subject: [PATCH 04/19] Test shouting other user's and current user's post --- backend/src/schema/resolvers/shout.spec.js | 177 ++++++++++++++++++++- 1 file changed, 172 insertions(+), 5 deletions(-) diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index 8cf6c6982..d38b1bef8 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -19,12 +19,13 @@ const mutationUnshoutPost = gql` unshout(id: $id, type: Post) } ` -const createPostMutation = gql` - mutation($id: ID, $title: String!, $content: String!, $categoryIds: [ID]!) { - CreatePost(id: $id, title: $title, content: $content, categoryIds: $categoryIds) { +const queryPost = gql` + query($id: ID!) { + Post(id: $id) { id - title - content + shoutedBy { + id + } } } ` @@ -57,5 +58,171 @@ describe('shout and unshout posts', () => { }) }) }) + describe('authenticated', () => { + let currentUser, postAuthor + beforeEach(async () => { + currentUser = await factory.create('User', { + id: 'current-user-id', + name: 'Current User', + email: 'current.user@example.org', + password: '1234', + }) + + postAuthor = await factory.create('User', { + id: 'post-author-id', + name: 'Post Author', + email: 'post.author@example.org', + password: '1234', + }) + authenticatedUser = await currentUser.toJson() + await factory.create('Post', { + name: 'Other user post', + id: 'other-user-post-id', + author: postAuthor, + }) + await factory.create('Post', { + name: 'current user post', + id: 'current-user-post-id', + author: currentUser, + }) + variables = {} + }) + + it('post of another user', async () => { + variables = { id: 'other-user-post-id' } + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + data: { shout: true }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'other-user-post-id', shoutedBy: [{ id: 'current-user-id' }] }] }, + errors: undefined, + }) + }) + + it('my own post', async () => { + variables = { id: 'current-user-post-id' } + await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ + data: { shout: false }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'current-user-post-id', shoutedBy: [] }] }, + errors: undefined, + }) + }) + }) }) }) + +// let clientUser1, clientUser2 +// let headersUser1, headersUser2 +// const factory = Factory() +// const instance = neode() +// const categoryIds = ['cat9'] + +// const mutationShoutPost = gql` +// mutation($id: ID!) { +// shout(id: $id, type: Post) +// } +// ` +// const mutationUnshoutPost = gql` +// mutation($id: ID!) { +// unshout(id: $id, type: Post) +// } +// ` +// const createPostMutation = gql` +// mutation($id: ID, $title: String!, $content: String!, $categoryIds: [ID]!) { +// CreatePost(id: $id, title: $title, content: $content, categoryIds: $categoryIds) { +// id +// title +// content +// } +// } +// ` +// const createPostVariables = { +// id: 'p1234', +// title: 'Post Title 1234', +// content: 'Some Post Content 1234', +// categoryIds, +// } +// beforeEach(async () => { +// await factory.create('User', { +// id: 'u1', +// email: 'test@example.org', +// password: '1234', +// }) +// await factory.create('User', { +// id: 'u2', +// email: 'test2@example.org', +// password: '1234', +// }) +// await instance.create('Category', { +// id: 'cat9', +// name: 'Democracy & Politics', +// icon: 'university', +// }) +// headersUser1 = await login({ email: 'test@example.org', password: '1234' }) +// headersUser2 = await login({ email: 'test2@example.org', password: '1234' }) +// clientUser1 = new GraphQLClient(host, { headers: headersUser1 }) +// clientUser2 = new GraphQLClient(host, { headers: headersUser2 }) + +// await clientUser1.request(createPostMutation, createPostVariables) +// await clientUser2.request(createPostMutation, { +// id: 'p12345', +// title: 'Post Title 12345', +// content: 'Some Post Content 12345', +// categoryIds, +// }) +// }) + +// afterEach(async () => { +// await factory.cleanDatabase() +// }) + +// describe('shout', () => { +// describe('shout foreign post', () => { +// describe('unauthenticated shout', () => { +// it('throws authorization error', async () => { +// const client = new GraphQLClient(host) +// await expect(client.request(mutationShoutPost, { id: 'p1234' })).rejects.toThrow( +// 'Not Authorised', +// ) +// }) +// }) + +// describe('unshout foreign post', () => { +// describe('unauthenticated shout', () => { +// it('throws authorization error', async () => { +// // shout +// await clientUser1.request(mutationShoutPost, { id: 'p12345' }) +// // unshout +// const client = new GraphQLClient(host) +// await expect(client.request(mutationUnshoutPost, { id: 'p12345' })).rejects.toThrow( +// 'Not Authorised', +// ) +// }) +// }) + +// it('I unshout a post of another user', async () => { +// // shout +// await clientUser1.request(mutationShoutPost, { id: 'p12345' }) +// const expected = { +// unshout: true, +// } +// // unshout +// const res = await clientUser1.request(mutationUnshoutPost, { id: 'p12345' }) +// expect(res).toMatchObject(expected) + +// const { Post } = await clientUser1.request(gql` +// query { +// Post(id: "p12345") { +// shoutedByCurrentUser +// } +// } +// `) +// const expected2 = { +// shoutedByCurrentUser: false, +// } +// expect(Post[0]).toMatchObject(expected2) +// }) +// }) +// }) From 839f671c14f875eecd20ad282d0615da21bff855 Mon Sep 17 00:00:00 2001 From: Alina Beck Date: Wed, 25 Sep 2019 16:51:35 +0100 Subject: [PATCH 05/19] Apply suggestions from code review --- backend/README.md | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/README.md b/backend/README.md index 41020116b..70506c68d 100644 --- a/backend/README.md +++ b/backend/README.md @@ -107,7 +107,7 @@ The output should look similar to this: ![Storybook output](../.gitbook/assets/storybook-output.png) -Click on the link http://172.18.0.6:3002/ to open the browser to your interactive storybook. +Click on the link http://localhost:3002/ to open the browser to your interactive storybook. {% endtab %} diff --git a/docker-compose.yml b/docker-compose.yml index 341c66885..6a7d21c45 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: - "BUILD_COMMIT=${TRAVIS_COMMIT}" ports: - 3000:3000 - - 3502:3502 + - 3002:3002 networks: - hc-network depends_on: From 53aa87ea3cd01b79abfe298fcacc070054a35d15 Mon Sep 17 00:00:00 2001 From: aonomike Date: Wed, 25 Sep 2019 21:44:47 +0300 Subject: [PATCH 06/19] Test Unshouting of a post - Tests passing individually but test suites failing --- backend/src/schema/resolvers/shout.spec.js | 174 +++++++-------------- 1 file changed, 55 insertions(+), 119 deletions(-) diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index d38b1bef8..031cdbc49 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -3,6 +3,7 @@ import Factory from '../../seed/factories' import { gql } from '../../jest/helpers' import { neode as getNeode, getDriver } from '../../bootstrap/neo4j' import createServer from '../../server' +import expectExport from 'expect' let mutate, query, authenticatedUser, variables const factory = Factory() @@ -30,6 +31,7 @@ const queryPost = gql` } ` describe('shout and unshout posts', () => { + let currentUser, postAuthor beforeAll(() => { authenticatedUser = undefined const { server } = createServer({ @@ -53,13 +55,13 @@ describe('shout and unshout posts', () => { describe('unauthenticated', () => { it('throws authorization error', async () => { variables = { id: 'post-to-shout-id' } + authenticatedUser = undefined await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ errors: [{ message: 'Not Authorised!' }], }) }) }) describe('authenticated', () => { - let currentUser, postAuthor beforeEach(async () => { currentUser = await factory.create('User', { id: 'current-user-id', @@ -77,7 +79,7 @@ describe('shout and unshout posts', () => { authenticatedUser = await currentUser.toJson() await factory.create('Post', { name: 'Other user post', - id: 'other-user-post-id', + id: 'another-user-post-id', author: postAuthor, }) await factory.create('Post', { @@ -88,13 +90,13 @@ describe('shout and unshout posts', () => { variables = {} }) - it('post of another user', async () => { - variables = { id: 'other-user-post-id' } + it("another user's post", async () => { + variables = { id: 'another-user-post-id' } await expect(mutate({ mutation: mutationShoutPost, variables })).resolves.toMatchObject({ data: { shout: true }, }) await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ - data: { Post: [{ id: 'other-user-post-id', shoutedBy: [{ id: 'current-user-id' }] }] }, + data: { Post: [{ id: 'another-user-post-id', shoutedBy: [{ id: 'current-user-id' }] }] }, errors: undefined, }) }) @@ -111,118 +113,52 @@ describe('shout and unshout posts', () => { }) }) }) + describe('unshout', () => { + describe('unauthenticated', () => { + it('throws authorization error', async () => { + authenticatedUser = undefined + variables = { id: 'post-to-shout-id' } + await expect(mutate({ mutation: mutationUnshoutPost, variables })).resolves.toMatchObject({ + errors: [{ message: 'Not Authorised!' }], + }) + }) + }) + + describe('authenticated', () => { + beforeEach(async () => { + currentUser = await factory.create('User', { + id: 'current-user-id', + name: 'Current User', + email: 'current.user@example.org', + password: '1234', + }) + + postAuthor = await factory.create('User', { + id: 'post-author-id', + name: 'Post Author', + email: 'post.author@example.org', + password: '1234', + }) + authenticatedUser = await currentUser.toJson() + await factory.create('Post', { + name: 'Other user post', + id: 'another-user-post-id', + author: postAuthor, + }) + variables = {} + await mutate({ mutation: mutationShoutPost, variables: { id: 'another-user-post-id' } }) + }) + + it("another user's post", async () => { + variables = { id: 'another-user-post-id' } + await expect(mutate({ mutation: mutationUnshoutPost, variables })).resolves.toMatchObject({ + data: { unshout: true }, + }) + await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ + data: { Post: [{ id: 'another-user-post-id', shoutedBy: [] }] }, + errors: undefined, + }) + }) + }) + }) }) - -// let clientUser1, clientUser2 -// let headersUser1, headersUser2 -// const factory = Factory() -// const instance = neode() -// const categoryIds = ['cat9'] - -// const mutationShoutPost = gql` -// mutation($id: ID!) { -// shout(id: $id, type: Post) -// } -// ` -// const mutationUnshoutPost = gql` -// mutation($id: ID!) { -// unshout(id: $id, type: Post) -// } -// ` -// const createPostMutation = gql` -// mutation($id: ID, $title: String!, $content: String!, $categoryIds: [ID]!) { -// CreatePost(id: $id, title: $title, content: $content, categoryIds: $categoryIds) { -// id -// title -// content -// } -// } -// ` -// const createPostVariables = { -// id: 'p1234', -// title: 'Post Title 1234', -// content: 'Some Post Content 1234', -// categoryIds, -// } -// beforeEach(async () => { -// await factory.create('User', { -// id: 'u1', -// email: 'test@example.org', -// password: '1234', -// }) -// await factory.create('User', { -// id: 'u2', -// email: 'test2@example.org', -// password: '1234', -// }) -// await instance.create('Category', { -// id: 'cat9', -// name: 'Democracy & Politics', -// icon: 'university', -// }) -// headersUser1 = await login({ email: 'test@example.org', password: '1234' }) -// headersUser2 = await login({ email: 'test2@example.org', password: '1234' }) -// clientUser1 = new GraphQLClient(host, { headers: headersUser1 }) -// clientUser2 = new GraphQLClient(host, { headers: headersUser2 }) - -// await clientUser1.request(createPostMutation, createPostVariables) -// await clientUser2.request(createPostMutation, { -// id: 'p12345', -// title: 'Post Title 12345', -// content: 'Some Post Content 12345', -// categoryIds, -// }) -// }) - -// afterEach(async () => { -// await factory.cleanDatabase() -// }) - -// describe('shout', () => { -// describe('shout foreign post', () => { -// describe('unauthenticated shout', () => { -// it('throws authorization error', async () => { -// const client = new GraphQLClient(host) -// await expect(client.request(mutationShoutPost, { id: 'p1234' })).rejects.toThrow( -// 'Not Authorised', -// ) -// }) -// }) - -// describe('unshout foreign post', () => { -// describe('unauthenticated shout', () => { -// it('throws authorization error', async () => { -// // shout -// await clientUser1.request(mutationShoutPost, { id: 'p12345' }) -// // unshout -// const client = new GraphQLClient(host) -// await expect(client.request(mutationUnshoutPost, { id: 'p12345' })).rejects.toThrow( -// 'Not Authorised', -// ) -// }) -// }) - -// it('I unshout a post of another user', async () => { -// // shout -// await clientUser1.request(mutationShoutPost, { id: 'p12345' }) -// const expected = { -// unshout: true, -// } -// // unshout -// const res = await clientUser1.request(mutationUnshoutPost, { id: 'p12345' }) -// expect(res).toMatchObject(expected) - -// const { Post } = await clientUser1.request(gql` -// query { -// Post(id: "p12345") { -// shoutedByCurrentUser -// } -// } -// `) -// const expected2 = { -// shoutedByCurrentUser: false, -// } -// expect(Post[0]).toMatchObject(expected2) -// }) -// }) -// }) From 644ea3578c2672e93987336f858770799c647492 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2019 07:24:57 +0000 Subject: [PATCH 07/19] Bump mustache from 3.0.3 to 3.1.0 in /backend Bumps [mustache](https://github.com/janl/mustache.js) from 3.0.3 to 3.1.0. - [Release notes](https://github.com/janl/mustache.js/releases) - [Changelog](https://github.com/janl/mustache.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/janl/mustache.js/compare/v3.0.3...v3.1.0) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/package.json b/backend/package.json index cd9985a03..e89cf4051 100644 --- a/backend/package.json +++ b/backend/package.json @@ -89,7 +89,7 @@ "metascraper-video": "^5.7.5", "metascraper-youtube": "^5.7.5", "minimatch": "^3.0.4", - "mustache": "^3.0.3", + "mustache": "^3.1.0", "neo4j-driver": "~1.7.6", "neo4j-graphql-js": "^2.7.2", "neode": "^0.3.3", diff --git a/backend/yarn.lock b/backend/yarn.lock index 29f0126da..6ab4e468a 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -6148,10 +6148,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mustache@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.3.tgz#ee4fb971887fa6cc1b6b6d219a74b5e3c7535f32" - integrity sha512-vM5FkMHamTYmVYeAujypihuPrJQDtaUIlKeeVb1AMJ73OZLtWiF7GprqrjxD0gJWT53W9JfqXxf97nXQjMQkqA== +mustache@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" + integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== mute-stream@0.0.8: version "0.0.8" From 357d4969baac29c12a74f6b350291d2421ba6869 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2019 07:25:49 +0000 Subject: [PATCH 08/19] Bump graphql from 14.5.7 to 14.5.8 in /webapp Bumps [graphql](https://github.com/graphql/graphql-js) from 14.5.7 to 14.5.8. - [Release notes](https://github.com/graphql/graphql-js/releases) - [Commits](https://github.com/graphql/graphql-js/commits) Signed-off-by: dependabot-preview[bot] --- webapp/package.json | 2 +- webapp/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webapp/package.json b/webapp/package.json index 39124acf2..d62f7fc5e 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -65,7 +65,7 @@ "cross-env": "~6.0.0", "date-fns": "2.2.1", "express": "~4.17.1", - "graphql": "~14.5.7", + "graphql": "~14.5.8", "isemail": "^3.2.0", "jsonwebtoken": "~8.5.1", "linkify-it": "~2.2.0", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 5d771fc17..54250aa02 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -7748,10 +7748,10 @@ graphql-upload@^8.0.2: http-errors "^1.7.2" object-path "^0.11.4" -"graphql@14.0.2 - 14.2.0 || ^14.3.1", graphql@^14.4.0, graphql@~14.5.7: - version "14.5.7" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.5.7.tgz#8646a3fcc07922319cc3967eba4a64b32929f77f" - integrity sha512-as410RMJSUFqF8RcH2QWxZ5ioqHzsH9VWnWbaU+UnDXJ/6azMDIYPrtXCBPXd8rlunEVb7W8z6fuUnNHMbFu9A== +"graphql@14.0.2 - 14.2.0 || ^14.3.1", graphql@^14.4.0, graphql@~14.5.8: + version "14.5.8" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.5.8.tgz#504f3d3114cb9a0a3f359bbbcf38d9e5bf6a6b3c" + integrity sha512-MMwmi0zlVLQKLdGiMfWkgQD7dY/TUKt4L+zgJ/aR0Howebod3aNgP5JkgvAULiR2HPVZaP2VEElqtdidHweLkg== dependencies: iterall "^1.2.2" From 44c70234fe049df72d87642ae2837f7bafc48a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wolfgang=20Hu=C3=9F?= Date: Fri, 27 Sep 2019 17:16:10 +0200 Subject: [PATCH 09/19] Try to fix VSCode format works against ESLint --- .vscode/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e2a727871..9acbf50bd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,6 @@ "autoFix": true } ], - "editor.formatOnSave": true, + "editor.formatOnSave": false, "eslint.autoFixOnSave": true -} +} \ No newline at end of file From c427cb2b97f07e623ba96c51f8fddd1c1f941821 Mon Sep 17 00:00:00 2001 From: aonomike Date: Sat, 28 Sep 2019 00:31:08 +0300 Subject: [PATCH 10/19] refactor the naming of variables --- backend/src/schema/resolvers/shout.spec.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index 031cdbc49..e39ac2e24 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -3,7 +3,6 @@ import Factory from '../../seed/factories' import { gql } from '../../jest/helpers' import { neode as getNeode, getDriver } from '../../bootstrap/neo4j' import createServer from '../../server' -import expectExport from 'expect' let mutate, query, authenticatedUser, variables const factory = Factory() @@ -30,6 +29,7 @@ const queryPost = gql` } } ` + describe('shout and unshout posts', () => { let currentUser, postAuthor beforeAll(() => { @@ -46,7 +46,6 @@ describe('shout and unshout posts', () => { mutate = createTestClient(server).mutate query = createTestClient(server).query }) - afterEach(() => { factory.cleanDatabase() }) @@ -134,28 +133,31 @@ describe('shout and unshout posts', () => { }) postAuthor = await factory.create('User', { - id: 'post-author-id', - name: 'Post Author', - email: 'post.author@example.org', + id: 'id-of-another-user', + name: 'Another User', + email: 'another.user@example.org', password: '1234', }) authenticatedUser = await currentUser.toJson() await factory.create('Post', { - name: 'Other user post', - id: 'another-user-post-id', + name: 'Posted By Another User', + id: 'posted-by-another-user', author: postAuthor, }) + await mutate({ + mutation: mutationShoutPost, + variables: { id: 'posted-by-another-user' }, + }) variables = {} - await mutate({ mutation: mutationShoutPost, variables: { id: 'another-user-post-id' } }) }) it("another user's post", async () => { - variables = { id: 'another-user-post-id' } + variables = { id: 'posted-by-another-user' } await expect(mutate({ mutation: mutationUnshoutPost, variables })).resolves.toMatchObject({ data: { unshout: true }, }) await expect(query({ query: queryPost, variables })).resolves.toMatchObject({ - data: { Post: [{ id: 'another-user-post-id', shoutedBy: [] }] }, + data: { Post: [{ id: 'posted-by-another-user', shoutedBy: [] }] }, errors: undefined, }) }) From 8c01f1d332e7afd70cea38608f1013a5f224a637 Mon Sep 17 00:00:00 2001 From: Vasily Belolapotkov Date: Sat, 28 Sep 2019 12:14:04 +0300 Subject: [PATCH 11/19] update neo4j docker config --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 587ec718f..e9d2f7464 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,6 +55,7 @@ services: - hc-network environment: - NEO4J_AUTH=none + - NEO4J_dbms_security_procedures_unrestricted=algo.*,apoc.* ports: - 7687:7687 - 7474:7474 From 1e9bd2acc6e8f83ce8fd8de2c3a7547a5fb1e18a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 13:38:05 +0000 Subject: [PATCH 12/19] Bump date-fns from 2.2.1 to 2.4.0 in /webapp Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.2.1 to 2.4.0. - [Release notes](https://github.com/date-fns/date-fns/releases) - [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md) - [Commits](https://github.com/date-fns/date-fns/compare/v2.2.1...v2.4.0) Signed-off-by: dependabot-preview[bot] --- webapp/package.json | 2 +- webapp/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webapp/package.json b/webapp/package.json index d62f7fc5e..841b32c53 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -63,7 +63,7 @@ "apollo-client": "~2.6.4", "cookie-universal-nuxt": "~2.0.18", "cross-env": "~6.0.0", - "date-fns": "2.2.1", + "date-fns": "2.4.0", "express": "~4.17.1", "graphql": "~14.5.8", "isemail": "^3.2.0", diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 54250aa02..49375e89c 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -5822,10 +5822,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.2.1.tgz#b3f79cf56760af106050c686f4c72586a3383ee9" - integrity sha512-4V1i5CnTinjBvJpXTq7sDHD4NY6JPcl15112IeSNNLUWQOQ+kIuCvRGOFZMQZNvkadw8F9QTyZxz59rIRU6K+w== +date-fns@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.4.0.tgz#e02d1d08ce80ae1db3de40a0028c9f54203d034b" + integrity sha512-xS547fK1omgCgOGbyU0fBY2pdeXQ9/WO/PMsVgX1jtF56dXNHrV3Z+GKWIOE7IG+UEeu+fTyTlnIvBKbxXxdSw== date-fns@^1.27.2: version "1.30.1" From 61f24dcfedd28c6bee6de97b7bd9a3184b63d1f7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 14:14:41 +0000 Subject: [PATCH 13/19] Bump apollo-server-testing from 2.9.3 to 2.9.4 in /backend Bumps [apollo-server-testing](https://github.com/apollographql/apollo-server) from 2.9.3 to 2.9.4. - [Release notes](https://github.com/apollographql/apollo-server/releases) - [Changelog](https://github.com/apollographql/apollo-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/apollographql/apollo-server/compare/apollo-server-testing@2.9.3...apollo-server-testing@2.9.4) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/package.json b/backend/package.json index e89cf4051..f06de2e6c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -112,7 +112,7 @@ "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/preset-env": "~7.6.0", "@babel/register": "~7.6.2", - "apollo-server-testing": "~2.9.3", + "apollo-server-testing": "~2.9.4", "babel-core": "~7.0.0-0", "babel-eslint": "~10.0.3", "babel-jest": "~24.9.0", diff --git a/backend/yarn.lock b/backend/yarn.lock index 6ab4e468a..975a0d1c0 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1764,12 +1764,12 @@ apollo-server-plugin-base@^0.6.4: dependencies: apollo-server-types "^0.2.4" -apollo-server-testing@~2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.9.3.tgz#38a86b5fa0bce57f8ec4fb581e5419437178b3e2" - integrity sha512-n2bIcVXQNFzr84FZK1S0o4PFqwb1pPuIg/fymjPYjtFP2OHmLLvGRm+KaXhUjxEAUh+/9zAQLhmgx+p6GMUAhA== +apollo-server-testing@~2.9.4: + version "2.9.4" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.9.4.tgz#421783573bdc5cef70dfe574b5193db38a33b5fb" + integrity sha512-qvnA9cXRKqizfYPHBli4LeSKYXwFVsQkGF3eHgofN/RbTqnEBqW7I5L14qDYAjGZg9/Z4alJf69hFE8KPHbT0Q== dependencies: - apollo-server-core "^2.9.3" + apollo-server-core "^2.9.4" apollo-server-types@^0.2.4: version "0.2.4" From cfcc17abb6f52564c6cf16a1cc375ffa254ec918 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 14:14:43 +0000 Subject: [PATCH 14/19] Bump @babel/cli from 7.6.0 to 7.6.2 in /backend Bumps [@babel/cli](https://github.com/babel/babel) from 7.6.0 to 7.6.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.6.0...v7.6.2) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/package.json b/backend/package.json index e89cf4051..5f5d5b4df 100644 --- a/backend/package.json +++ b/backend/package.json @@ -106,7 +106,7 @@ "xregexp": "^4.2.4" }, "devDependencies": { - "@babel/cli": "~7.6.0", + "@babel/cli": "~7.6.2", "@babel/core": "~7.6.0", "@babel/node": "~7.6.1", "@babel/plugin-proposal-throw-expressions": "^7.2.0", diff --git a/backend/yarn.lock b/backend/yarn.lock index 6ab4e468a..8f945623f 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -14,10 +14,10 @@ resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc" integrity sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ== -"@babel/cli@~7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.0.tgz#1470a04394eaf37862989ea4912adf440fa6ff8d" - integrity sha512-1CTDyGUjQqW3Mz4gfKZ04KGOckyyaNmKneAMlABPS+ZyuxWv3FrVEVz7Ag08kNIztVx8VaJ8YgvYLSNlMKAT5Q== +"@babel/cli@~7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.6.2.tgz#4ce8b5b4b2e4b4c1b7bd841cec62085e2dfc4465" + integrity sha512-JDZ+T/br9pPfT2lmAMJypJDTTTHM9ePD/ED10TRjRzJVdEVy+JB3iRlhzYmTt5YkNgHvxWGlUVnLtdv6ruiDrQ== dependencies: commander "^2.8.1" convert-source-map "^1.1.0" From f52980dade3972c7dc608750999a8710efd5a968 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 14:14:43 +0000 Subject: [PATCH 15/19] Bump cypress-file-upload from 3.3.3 to 3.3.4 Bumps [cypress-file-upload](https://github.com/abramenal/cypress-file-upload) from 3.3.3 to 3.3.4. - [Release notes](https://github.com/abramenal/cypress-file-upload/releases) - [Commits](https://github.com/abramenal/cypress-file-upload/compare/v3.3.3...v3.3.4) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d71a399b3..94e567787 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "cross-env": "^6.0.0", "cypress": "^3.4.1", "cypress-cucumber-preprocessor": "^1.16.0", - "cypress-file-upload": "^3.3.3", + "cypress-file-upload": "^3.3.4", "cypress-plugin-retries": "^1.3.0", "dotenv": "^8.1.0", "faker": "Marak/faker.js#master", diff --git a/yarn.lock b/yarn.lock index 0380317ee..54937694e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1894,10 +1894,10 @@ cypress-cucumber-preprocessor@^1.16.0: glob "^7.1.2" through "^2.3.8" -cypress-file-upload@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.3.3.tgz#119188fa78e9cfc00904c52d76d4ca56d34950df" - integrity sha512-CmXGRMHonoyCa8EcF6jomxqMAe56HvKfnW7S69EmTga8ecYmvQUI6gYttcHO+5UTmFQOFl7xbABV3+AbnI4btA== +cypress-file-upload@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.3.4.tgz#cbeb8a7a07150a1c60f2873666979e48b6335070" + integrity sha512-kfdrQ6cWBw82G7EbHSqZJiOQWRh9cGz9K1mjePNZax00gBL0qOdRTjfkAnR2vEmmJyCfnN3efryjfhFeLrGWVw== cypress-plugin-retries@^1.3.0: version "1.3.0" From fcc10d11ca0fa8326795b4575fa18fb4b7d96451 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 14:14:56 +0000 Subject: [PATCH 16/19] Bump metascraper-description from 5.7.4 to 5.7.5 in /backend Bumps [metascraper-description](https://github.com/microlinkhq/metascraper) from 5.7.4 to 5.7.5. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v5.7.4...v5.7.5) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/package.json b/backend/package.json index e89cf4051..de6df5022 100644 --- a/backend/package.json +++ b/backend/package.json @@ -77,7 +77,7 @@ "metascraper-author": "^5.7.4", "metascraper-clearbit-logo": "^5.3.0", "metascraper-date": "^5.7.4", - "metascraper-description": "^5.7.4", + "metascraper-description": "^5.7.5", "metascraper-image": "^5.7.5", "metascraper-lang": "^5.7.4", "metascraper-lang-detector": "^4.8.5", diff --git a/backend/yarn.lock b/backend/yarn.lock index 6ab4e468a..8fd2f95ff 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -5911,12 +5911,12 @@ metascraper-date@^5.7.4: dependencies: "@metascraper/helpers" "^5.7.4" -metascraper-description@^5.7.4: - version "5.7.4" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.7.4.tgz#f1fd88ee5b1c1fac5e7db3dcae8c69e342e6efd6" - integrity sha512-qncq4IjsFK+ZEdWjtjhokozoWu76qfVHG/RIRHjrDG19tTwWv+PXlgyvtFaetxezI4+lR3uQHssLVb7Nv9meJw== +metascraper-description@^5.7.5: + version "5.7.5" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.7.5.tgz#b19be853f7f712d2c388cb0c4086b3b38f6e603b" + integrity sha512-9WHt9XRIj7OCS1wkFbvFI4dOkdgc6I74dC78UcVlwJYJKpRRonm83i5opev4chG4psOwbUhZUhKS3n+Rb8khCg== dependencies: - "@metascraper/helpers" "^5.7.4" + "@metascraper/helpers" "^5.7.5" metascraper-image@^5.7.5: version "5.7.5" From acf3102a7c6fe15f656f00f0e13c18a7ca7932ac Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 14:15:09 +0000 Subject: [PATCH 17/19] Bump @hapi/joi from 16.1.2 to 16.1.4 in /backend Bumps [@hapi/joi](https://github.com/hapijs/joi) from 16.1.2 to 16.1.4. - [Release notes](https://github.com/hapijs/joi/releases) - [Changelog](https://github.com/hapijs/joi/blob/master/CHANGELOG.md) - [Commits](https://github.com/hapijs/joi/compare/v16.1.2...v16.1.4) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/backend/package.json b/backend/package.json index e89cf4051..a2a74e23f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -41,7 +41,7 @@ ] }, "dependencies": { - "@hapi/joi": "^16.1.2", + "@hapi/joi": "^16.1.4", "@sentry/node": "^5.6.2", "activitystrea.ms": "~2.1.3", "apollo-cache-inmemory": "~1.6.3", diff --git a/backend/yarn.lock b/backend/yarn.lock index 6ab4e468a..4dc7838ae 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -736,10 +736,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@hapi/address@2.x.x", "@hapi/address@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.1.tgz#61395b5ed94c4cb19c2dc4c85969cff3d40d583f" - integrity sha512-DYuHzu978pP1XW1GD3HGvLnAFjbQTIgc2+V153FGkbS2pgo9haigCdwBnUDrbhaOkgiJlbZvoEqDrcxSLHpiWA== +"@hapi/address@2.x.x", "@hapi/address@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.2.tgz#1c794cd6dbf2354d1eb1ef10e0303f573e1c7222" + integrity sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q== "@hapi/bourne@1.x.x": version "1.3.2" @@ -766,12 +766,12 @@ "@hapi/hoek" "8.x.x" "@hapi/topo" "3.x.x" -"@hapi/joi@^16.1.2": - version "16.1.2" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.2.tgz#c566d9e0d81d6847f7622f7d5e23adadaa2d7332" - integrity sha512-wkMIEMQQPNmat9P7zws7wO8Gon9W3NgG5Pac1m0LK8bQ1bbszofxzL0CJogAgzitk5rZZw5/txR+wOK/ioLmGw== +"@hapi/joi@^16.1.4": + version "16.1.4" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-16.1.4.tgz#b039fe474a0ab838c1a90620c53a208fcef75d99" + integrity sha512-m7ctezhxjob+dSpXnCNlgAj6rrEpdSsaWu3GWL3g1AybQCU36mlAo9IwGFJwIxD+oHgdO6mYyviYlaejX+qN6g== dependencies: - "@hapi/address" "^2.1.1" + "@hapi/address" "^2.1.2" "@hapi/formula" "^1.2.0" "@hapi/hoek" "^8.2.4" "@hapi/pinpoint" "^1.0.2" From 2dd47dbdc21acbdc615f5378e8ecb213c9bcbdc0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2019 21:47:59 +0000 Subject: [PATCH 18/19] Bump @babel/core from 7.6.0 to 7.6.2 in /backend Bumps [@babel/core](https://github.com/babel/babel) from 7.6.0 to 7.6.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md) - [Commits](https://github.com/babel/babel/compare/v7.6.0...v7.6.2) Signed-off-by: dependabot-preview[bot] --- backend/package.json | 2 +- backend/yarn.lock | 60 ++++++++++++++++++++------------------------ 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/backend/package.json b/backend/package.json index 273c57c43..5ab972598 100644 --- a/backend/package.json +++ b/backend/package.json @@ -107,7 +107,7 @@ }, "devDependencies": { "@babel/cli": "~7.6.2", - "@babel/core": "~7.6.0", + "@babel/core": "~7.6.2", "@babel/node": "~7.6.1", "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/preset-env": "~7.6.0", diff --git a/backend/yarn.lock b/backend/yarn.lock index e361b340c..7ca9c1e16 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -38,17 +38,17 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.1.0", "@babel/core@~7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" - integrity sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw== +"@babel/core@^7.1.0", "@babel/core@~7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" + integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.0" - "@babel/helpers" "^7.6.0" - "@babel/parser" "^7.6.0" + "@babel/generator" "^7.6.2" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.2" "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.0" + "@babel/traverse" "^7.6.2" "@babel/types" "^7.6.0" convert-source-map "^1.1.0" debug "^4.1.0" @@ -58,16 +58,15 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56" - integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA== +"@babel/generator@^7.4.0", "@babel/generator@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" + integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== dependencies: "@babel/types" "^7.6.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" @@ -224,13 +223,13 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.0.tgz#21961d16c6a3c3ab597325c34c465c0887d31c6e" - integrity sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ== +"@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== dependencies: "@babel/template" "^7.6.0" - "@babel/traverse" "^7.6.0" + "@babel/traverse" "^7.6.2" "@babel/types" "^7.6.0" "@babel/highlight@^7.0.0": @@ -254,10 +253,10 @@ node-environment-flags "^1.0.5" v8flags "^3.1.1" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" - integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" + integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -704,16 +703,16 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516" - integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" + integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== dependencies: "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.6.0" + "@babel/generator" "^7.6.2" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.6.0" + "@babel/parser" "^7.6.2" "@babel/types" "^7.6.0" debug "^4.1.0" globals "^11.1.0" @@ -8332,11 +8331,6 @@ trigram-utils@^1.0.0: n-gram "^1.0.0" trim "0.0.1" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" From 0f7bfea1b034298f88ca37fec07e95989b051a4a Mon Sep 17 00:00:00 2001 From: roschaefer Date: Sun, 29 Sep 2019 00:14:13 +0200 Subject: [PATCH 19/19] docs: moves storybook into webapp/README.md It makes much more sense to put it under the webapp's README than backend. FYI: @mattwr18 --- backend/README.md | 35 ----------------------------------- webapp/README.md | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/backend/README.md b/backend/README.md index 70506c68d..14e6d0ddd 100644 --- a/backend/README.md +++ b/backend/README.md @@ -90,41 +90,6 @@ $ yarn run db:reset {% endtab %} {% endtabs %} -### Storybook - -We encourage contributors to use Storybook to test out new components in an isolated way, and benefit from its many features. -See the docs for live examples and answers to FAQ, among other helpful information. ![Storybook docs](https://storybook.js.org/docs/basics/introduction/) - -{% tabs %} -{% tab title="Docker" %} - -After you have started the application following the instructions above, in another terminal run: - -```bash -$ docker-compose exec webapp yarn storybook -``` -The output should look similar to this: - -![Storybook output](../.gitbook/assets/storybook-output.png) - -Click on the link http://localhost:3002/ to open the browser to your interactive storybook. - -{% endtab %} - -{% tab title="Without Docker" %} -Run the following command: - -```bash -# in webapp/ -yarn storybook -``` - -Open http://localhost:3002/ in your browser - -{% endtab %} -{% endtabs %} - - # Testing **Beware**: We have no multiple database setup at the moment. We clean the diff --git a/webapp/README.md b/webapp/README.md index 604c7e6ba..b9c235196 100644 --- a/webapp/README.md +++ b/webapp/README.md @@ -33,6 +33,42 @@ $ yarn build $ yarn start ``` +### Storybook + +We encourage contributors to use Storybook to test out new components in an isolated way, and benefit from its many features. +See the docs for live examples and answers to FAQ, among other helpful information. ![Storybook docs](https://storybook.js.org/docs/basics/introduction/) + +{% tabs %} +{% tab title="Docker" %} + +After you have started the application following the instructions above, in another terminal run: + +```bash +$ docker-compose exec webapp yarn storybook +``` +The output should look similar to this: + +![Storybook output](../.gitbook/assets/storybook-output.png) + +Click on the link http://localhost:3002/ to open the browser to your interactive storybook. + +{% endtab %} + +{% tab title="Without Docker" %} +Run the following command: + +```bash +# in webapp/ +yarn storybook +``` + +Open http://localhost:3002/ in your browser + +{% endtab %} +{% endtabs %} + + + ## Styleguide All reusable Components \(for example avatar\) should be done inside the [Nitro-Styleguide](https://github.com/Human-Connection/Nitro-Styleguide) repository.