From 8b0be5fb89037e583862f61c42da54b96b5bc132 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 15 Nov 2018 12:33:05 +0100 Subject: [PATCH 01/29] try to fix seeder with authentication --- package.json | 3 ++- src/middleware/dateTimeMiddleware.js | 20 ++++++++++++++---- src/middleware/permissionsMiddleware.js | 16 ++++++++++++++ yarn.lock | 28 +++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2e7d88f77..c671b12aa 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "./node_modules/.bin/nodemon --exec babel-node src/index.js", "start:debug": "./node_modules/.bin/nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js", - "seedDb": "./node_modules/.bin/babel-node src/seed/seed-db.js" + "seedDb": "cross-env IS_SEEDING='true' ./node_modules/.bin/babel-node src/seed/seed-db.js && cross-env IS_SEEDING=false" }, "author": "Grzegorz Leoniec", "license": "MIT", @@ -19,6 +19,7 @@ "apollo-server": "^2.0.4", "bcryptjs": "^2.4.3", "cheerio": "^1.0.0-rc.2", + "cross-env": "^5.2.0", "date-fns": "^2.0.0-alpha.24", "dotenv": "^6.0.0", "graphql-custom-directives": "^0.2.13", diff --git a/src/middleware/dateTimeMiddleware.js b/src/middleware/dateTimeMiddleware.js index 8fd3c074b..7a83eb58d 100644 --- a/src/middleware/dateTimeMiddleware.js +++ b/src/middleware/dateTimeMiddleware.js @@ -3,28 +3,40 @@ import format from 'date-fns/format' export default { Mutation: { CreateUser: async (resolve, root, args, context, info) => { - args.createdAt = format(new Date()) + try { + args.createdAt = format(new Date()) + } catch (err) {} + args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreatePost: async (resolve, root, args, context, info) => { - args.createdAt = format(new Date()) + try { + args.createdAt = format(new Date()) + } catch (err) {} + args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreateComment: async (resolve, root, args, context, info) => { - args.createdAt = format(new Date()) + try { + args.createdAt = format(new Date()) + } catch (err) {} + args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreateOrganization: async (resolve, root, args, context, info) => { - args.createdAt = format(new Date()) + try { + args.createdAt = format(new Date()) + } catch (err) {} + args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index 11b4aabe4..83e1742e9 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -1,16 +1,32 @@ import { rule, shield, and, or, not, allow } from 'graphql-shield' const isAuthenticated = rule()(async (parent, args, ctx, info) => { + console.log('isSeeding', process.env.IS_SEEDING) + if (process.env.IS_SEEDING === true) { + return true + } return ctx.user !== null }) const isOwner = rule()(async (parent, args, ctx, info) => { + console.log('isSeeding', process.env.IS_SEEDING) + if (process.env.IS_SEEDING === true) { + return true + } console.log('parent', parent) return ctx.user.id === parent.id }) const isAdmin = rule()(async (parent, args, ctx, info) => { + console.log('isSeeding', process.env.IS_SEEDING) + if (process.env.IS_SEEDING === true) { + return true + } return ctx.user.role === 'ADMIN' }) const isModerator = rule()(async (parent, args, ctx, info) => { + console.log('isSeeding', process.env.IS_SEEDING) + if (process.env.IS_SEEDING === true) { + return true + } return ctx.user.role === 'MODERATOR' }) diff --git a/yarn.lock b/yarn.lock index c17a0c3c4..da7252b6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1405,6 +1405,14 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +cross-env@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + cross-fetch@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" @@ -1420,6 +1428,17 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" @@ -2524,7 +2543,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2918,6 +2937,11 @@ neo4j-graphql-js@1.0.5: lodash "^4.17.10" neo4j-driver "^1.6.1" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + node-fetch@1.6.3: version "1.6.3" resolved "http://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" @@ -3203,7 +3227,7 @@ path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" From 59e9b9df1de56e6e5850663da699484ee56478c8 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 15 Nov 2018 12:44:41 +0100 Subject: [PATCH 02/29] fixed date format --- src/middleware/dateTimeMiddleware.js | 20 ++++---------------- src/middleware/permissionsMiddleware.js | 4 ++++ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/middleware/dateTimeMiddleware.js b/src/middleware/dateTimeMiddleware.js index 7a83eb58d..b0ab1e539 100644 --- a/src/middleware/dateTimeMiddleware.js +++ b/src/middleware/dateTimeMiddleware.js @@ -3,40 +3,28 @@ import format from 'date-fns/format' export default { Mutation: { CreateUser: async (resolve, root, args, context, info) => { - try { - args.createdAt = format(new Date()) - } catch (err) {} - + args.createdAt = (new Date()).toISOString() args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreatePost: async (resolve, root, args, context, info) => { - try { - args.createdAt = format(new Date()) - } catch (err) {} - + args.createdAt = (new Date()).toISOString() args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreateComment: async (resolve, root, args, context, info) => { - try { - args.createdAt = format(new Date()) - } catch (err) {} - + args.createdAt = (new Date()).toISOString() args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) return result }, CreateOrganization: async (resolve, root, args, context, info) => { - try { - args.createdAt = format(new Date()) - } catch (err) {} - + args.createdAt = (new Date()).toISOString() args.disabled = false args.deleted = false const result = await resolve(root, args, context, info) diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index 83e1742e9..4956b9b15 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -1,6 +1,7 @@ import { rule, shield, and, or, not, allow } from 'graphql-shield' const isAuthenticated = rule()(async (parent, args, ctx, info) => { + // TODO: how to get this working while seeding? console.log('isSeeding', process.env.IS_SEEDING) if (process.env.IS_SEEDING === true) { return true @@ -8,6 +9,7 @@ const isAuthenticated = rule()(async (parent, args, ctx, info) => { return ctx.user !== null }) const isOwner = rule()(async (parent, args, ctx, info) => { + // TODO: how to get this working while seeding? console.log('isSeeding', process.env.IS_SEEDING) if (process.env.IS_SEEDING === true) { return true @@ -16,6 +18,7 @@ const isOwner = rule()(async (parent, args, ctx, info) => { return ctx.user.id === parent.id }) const isAdmin = rule()(async (parent, args, ctx, info) => { + // TODO: how to get this working while seeding? console.log('isSeeding', process.env.IS_SEEDING) if (process.env.IS_SEEDING === true) { return true @@ -23,6 +26,7 @@ const isAdmin = rule()(async (parent, args, ctx, info) => { return ctx.user.role === 'ADMIN' }) const isModerator = rule()(async (parent, args, ctx, info) => { + // TODO: how to get this working while seeding? console.log('isSeeding', process.env.IS_SEEDING) if (process.env.IS_SEEDING === true) { return true From 96da90a25514cbf30d133d51cf71194c004a0d88 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 16 Nov 2018 20:59:05 +0100 Subject: [PATCH 03/29] first attempt to automate dynamic seeding --- src/middleware/permissionsMiddleware.js | 12 +- src/seed/data/badges.js | 12 ++ src/seed/data/index.js | 27 +++++ src/seed/data/users-badges.js | 12 ++ src/seed/data/users.js | 68 +++++++++++ src/seed/seed-db.js | 7 +- src/seed/seed-helpers.js | 145 ++++++++++++++++++++++++ 7 files changed, 276 insertions(+), 7 deletions(-) create mode 100644 src/seed/data/badges.js create mode 100644 src/seed/data/index.js create mode 100644 src/seed/data/users-badges.js create mode 100644 src/seed/data/users.js create mode 100644 src/seed/seed-helpers.js diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index 4956b9b15..0386994cc 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -37,17 +37,19 @@ const isModerator = rule()(async (parent, args, ctx, info) => { // Permissions const permissions = shield({ Query: { - statistics: isAdmin + statistics: isAdmin, // fruits: and(isAuthenticated, or(isAdmin, isModerator)), // customers: and(isAuthenticated, isAdmin) }, Mutation: { // addFruitToBasket: isAuthenticated + CreateUser: allow }, - User: { - email: isOwner, - password: isOwner - }, + // TODO: re-activate this after fixing the initial seed + // User: { + // email: isOwner, + // password: isOwner + // }, Post: isAuthenticated }) diff --git a/src/seed/data/badges.js b/src/seed/data/badges.js new file mode 100644 index 000000000..d4144d30e --- /dev/null +++ b/src/seed/data/badges.js @@ -0,0 +1,12 @@ +export default function (data) { + return ` + mutation { + b1: CreateBadge(id: "b1", key: "indiegogo_en_racoon", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_racoon.svg") { id } + b2: CreateBadge(id: "b2", key: "indiegogo_en_rabbit", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rabbit.svg") { id } + b3: CreateBadge(id: "b3", key: "indiegogo_en_wolf", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_wolf.svg") { id } + b4: CreateBadge(id: "b4", key: "indiegogo_en_bear", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_bear.svg") { id } + b5: CreateBadge(id: "b5", key: "indiegogo_en_turtle", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_turtle.svg") { id } + b6: CreateBadge(id: "b6", key: "indiegogo_en_rhino", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rhino.svg") { id } + } + ` +} diff --git a/src/seed/data/index.js b/src/seed/data/index.js new file mode 100644 index 000000000..0ac7681aa --- /dev/null +++ b/src/seed/data/index.js @@ -0,0 +1,27 @@ +import gql from 'graphql-tag' +import helper from '../seed-helpers' + +const seed = { + Badges: require('./badges.js').default, + User: require('./users.js').default, + UserBadges: require('./users-badges.js').default +}; + +let data = {} + +export default async function (client) { + // iterate through seeds + await helper.asyncForEach(Object.keys(seed), async key => { + const mutations = seed[key] + try { + const res = await client + .mutate({ + mutation: gql(mutations(data)) + }) + data[key] = Object.assign(data[key] || {}, res.data) + } catch (err) { + console.error(err) + } + }) + console.log('Seeded Data', data) +} diff --git a/src/seed/data/users-badges.js b/src/seed/data/users-badges.js new file mode 100644 index 000000000..1a8bc1fe1 --- /dev/null +++ b/src/seed/data/users-badges.js @@ -0,0 +1,12 @@ +export default function (data) { + return ` + mutation { + b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } + b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } + b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } + b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } + b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } + b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } + } + ` +} diff --git a/src/seed/data/users.js b/src/seed/data/users.js new file mode 100644 index 000000000..2c148bc0c --- /dev/null +++ b/src/seed/data/users.js @@ -0,0 +1,68 @@ +import faker from 'faker' + +export default function (data) { + return ` + mutation { + u1: CreateUser( + id: "u1", + name: "Peter Lustig", + password: "1234", + email: "admin@example.org", + avatar: "${faker.internet.avatar()}", + role: admin, + disabled: false, + deleted: false) { + id + name + email + avatar + role + } + u2: CreateUser( + id: "u2", + name: "Bob der Bausmeister", + password: "1234", + email: "moderator@example.org", + avatar: "${faker.internet.avatar()}", + role: moderator, + disabled: false, + deleted: false) { + id + name + email + avatar + role + } + u3: CreateUser( + id: "u3", + name: "Jenny Rostock", + password: "1234", + email: "user@example.org", + avatar: "${faker.internet.avatar()}", + role: user, + disabled: false, + deleted: false) { + id + name + email + avatar + role + } + u4: CreateUser( + id: "u4", + name: "Angie Banjie", + password: "1234", + email: "angie@example.org", + avatar: "${faker.internet.avatar()}", + role: user, + disabled: false, + deleted: false) { + id + name + email + avatar + role + } + } + ` +} diff --git a/src/seed/seed-db.js b/src/seed/seed-db.js index 1fa478fd1..0617a53fe 100644 --- a/src/seed/seed-db.js +++ b/src/seed/seed-db.js @@ -5,6 +5,7 @@ import seedMutations from "./seed-mutations"; import fetch from "node-fetch"; import { HttpLink } from "apollo-link-http"; import { InMemoryCache } from "apollo-cache-inmemory"; +import Seed from './data/index' dotenv.config(); @@ -13,9 +14,11 @@ const client = new ApolloClient({ cache: new InMemoryCache() }); -client +Seed(client) + +/* client .mutate({ mutation: gql(seedMutations) }) .then(data => console.log(data)) - .catch(error => console.error(error)); + .catch(error => console.error(error)); **/ diff --git a/src/seed/seed-helpers.js b/src/seed/seed-helpers.js new file mode 100644 index 000000000..590b9c514 --- /dev/null +++ b/src/seed/seed-helpers.js @@ -0,0 +1,145 @@ +const _ = require('lodash') +const faker = require('faker') +const unsplashTopics = [ + 'love', + 'family', + 'spring', + 'business', + 'nature', + 'travel', + 'happy', + 'landscape', + 'health', + 'friends', + 'computer', + 'autumn', + 'space', + 'animal', + 'smile', + 'face', + 'people', + 'portrait', + 'amazing' +] +let unsplashTopicsTmp = [] + +const ngoLogos = [ + 'http://www.fetchlogos.com/wp-content/uploads/2015/11/Girl-Scouts-Of-The-Usa-Logo.jpg', + 'http://logos.textgiraffe.com/logos/logo-name/Ngo-designstyle-friday-m.png', + 'http://seeklogo.com/images/N/ngo-logo-BD53A3E024-seeklogo.com.png', + 'https://dcassetcdn.com/design_img/10133/25833/25833_303600_10133_image.jpg', + 'https://cdn.tutsplus.com/vector/uploads/legacy/articles/08bad_ngologos/20.jpg', + 'https://cdn.tutsplus.com/vector/uploads/legacy/articles/08bad_ngologos/33.jpg', + null +] + +const difficulties = ['easy', 'medium', 'hard'] + +export default { + randomItem: (items, filter) => { + let ids = filter + ? Object.keys(items) + .filter(id => { + return filter(items[id]) + }) + : _.keys(items) + let randomIds = _.shuffle(ids) + return items[randomIds.pop()] + }, + randomItems: (items, key = '_id', min = 1, max = 1) => { + let randomIds = _.shuffle(_.keys(items)) + let res = [] + + const count = _.random(min, max) + + for (let i = 0; i < count; i++) { + let r = items[randomIds.pop()][key] + if (key === '_id') { + r = r.toString() + } + res.push(r) + } + return res + }, + random: (items) => { + return _.shuffle(items).pop() + }, + randomDifficulty: () => { + return _.shuffle(difficulties).pop() + }, + randomLogo: () => { + return _.shuffle(ngoLogos).pop() + }, + randomUnsplashUrl: () => { + if (Math.random() < 0.6) { + // do not attach images in 60 percent of the cases (faster seeding) + return + } + if (unsplashTopicsTmp.length < 2) { + unsplashTopicsTmp = _.shuffle(unsplashTopics) + } + return 'https://source.unsplash.com/daily?' + unsplashTopicsTmp.pop() + ',' + unsplashTopicsTmp.pop() + }, + randomCategories: (seederstore, allowEmpty = false) => { + let count = Math.round(Math.random() * 3) + if (allowEmpty === false && count === 0) { + count = 1 + } + let categorieIds = _.shuffle(_.keys(seederstore.categories)) + let ids = [] + for (let i = 0; i < count; i++) { + ids.push(categorieIds.pop()) + } + return ids + }, + randomAddresses: () => { + const count = Math.round(Math.random() * 3) + let addresses = [] + for (let i = 0; i < count; i++) { + addresses.push({ + city: faker.address.city(), + zipCode: faker.address.zipCode(), + street: faker.address.streetAddress(), + country: faker.address.countryCode(), + lat: 54.032726 - (Math.random() * 10), + lng: 6.558838 + (Math.random() * 10) + }) + } + return addresses + }, + /** + * Get array of ids from the given seederstore items after mapping them by the key in the values + * + * @param items items from the seederstore + * @param values values for which you need the ids + * @param key the field key that is represented in the values (slug, name, etc.) + */ + mapIdsByKey: (items, values, key) => { + let res = [] + values.forEach(value => { + res.push(_.find(items, [key, value])._id.toString()) + }) + return res + }, + /** + * Provide a way to iterate for each element in an array while waiting for async functions to finish + * + * @param array + * @param callback + * @returns {Promise} + */ + asyncForEach: async (array, callback) => { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array) + } + }, + genInviteCode: () => { + const chars = '23456789abcdefghkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ' + let code = '' + for (let i = 0; i < 8; i++) { + const n = _.random(0, chars.length-1) + code += chars.substr(n, 1) + } + return code + } +} From 803e613c4b6e37e6b9108e9375b251daf41c83f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Tue, 20 Nov 2018 20:53:48 +0100 Subject: [PATCH 04/29] Clean way to seed the database 1. Temporarily open another backend with permissions disabled 2. Connect to this backend and run seed data --- package.json | 8 +- src/index.js | 2 +- src/middleware/index.js | 25 +- src/middleware/permissionsMiddleware.js | 21 - yarn.lock | 669 +++++++++++++++++++++++- 5 files changed, 681 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index c671b12aa..236dd805b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "./node_modules/.bin/nodemon --exec babel-node src/index.js", "start:debug": "./node_modules/.bin/nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js", - "seedDb": "cross-env IS_SEEDING='true' ./node_modules/.bin/babel-node src/seed/seed-db.js && cross-env IS_SEEDING=false" + "db:seed": "concurrently --kill-others --success first 'cross-env GRAPHQL_URI=http://localhost:4001 PERMISSIONS=disabled GRAPHQL_LISTEN_PORT=4001 yarn run start' 'wait-on tcp:4001 && cross-env GRAPHQL_URI=http://localhost:4001 ./node_modules/.bin/babel-node src/seed/seed-db.js'" }, "author": "Grzegorz Leoniec", "license": "MIT", @@ -19,7 +19,6 @@ "apollo-server": "^2.0.4", "bcryptjs": "^2.4.3", "cheerio": "^1.0.0-rc.2", - "cross-env": "^5.2.0", "date-fns": "^2.0.0-alpha.24", "dotenv": "^6.0.0", "graphql-custom-directives": "^0.2.13", @@ -44,7 +43,10 @@ "devDependencies": { "babel-cli": "^6.26.0", "babel-preset-env": "^1.7.0", + "concurrently": "^4.1.0", + "cross-env": "^5.2.0", "faker": "^4.1.0", - "nodemon": "^1.18.4" + "nodemon": "^1.18.4", + "wait-on": "^3.2.0" } } diff --git a/src/index.js b/src/index.js index 5c3face1a..ff62bb7b0 100644 --- a/src/index.js +++ b/src/index.js @@ -67,7 +67,7 @@ server.express.use(passport.initialize()) server.express.post('/graphql', passport.authenticate(['jwt'], { session: false })) const serverConfig = { - port: 4000 + port: process.env.GRAPHQL_LISTEN_PORT // cors: { // credentials: true, // origin: [process.env.CLIENT_URI] // your frontend url. diff --git a/src/middleware/index.js b/src/middleware/index.js index f743ae74f..6ed0fa697 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -7,13 +7,18 @@ import dateTimeMiddleware from './dateTimeMiddleware'; import xssMiddleware from './xssMiddleware'; import permissionsMiddleware from './permissionsMiddleware'; -export default schema => [ - permissionsMiddleware.generate(schema), - passwordMiddleware, - dateTimeMiddleware, - sluggifyMiddleware, - excerptMiddleware, - xssMiddleware, - fixImageUrlsMiddleware, - softDeleteMiddleware -] +export default schema => { + let middleware = [ + passwordMiddleware, + dateTimeMiddleware, + sluggifyMiddleware, + excerptMiddleware, + xssMiddleware, + fixImageUrlsMiddleware, + softDeleteMiddleware + ] + if (process.env.PERMISSIONS !== 'disabled') { + middleware.push(permissionsMiddleware.generate(schema)) + } + return middleware +} diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index 0386994cc..d82be9f5b 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -1,36 +1,15 @@ import { rule, shield, and, or, not, allow } from 'graphql-shield' const isAuthenticated = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user !== null }) const isOwner = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } - console.log('parent', parent) return ctx.user.id === parent.id }) const isAdmin = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user.role === 'ADMIN' }) const isModerator = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user.role === 'MODERATOR' }) diff --git a/yarn.lock b/yarn.lock index da7252b6b..091de27c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -176,6 +176,16 @@ accepts@^1.3.5, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +ajv@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" + integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -506,6 +516,18 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -532,6 +554,11 @@ async-retry@^1.2.1: dependencies: retry "0.12.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -558,6 +585,16 @@ aws-sdk@^*: uuid "3.1.0" xml2js "0.4.19" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + babel-cli@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" @@ -1077,6 +1114,13 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + bcryptjs@^2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" @@ -1175,6 +1219,11 @@ buffer@4.9.1: ieee754 "^1.1.4" isarray "^1.0.0" +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + busboy@^0.2.14: version "0.2.14" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" @@ -1204,6 +1253,11 @@ camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + caniuse-lite@^1.0.30000844: version "1.0.30000892" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000892.tgz#344d2b51ee3ff5977537da4aa449c90eec40b759" @@ -1212,6 +1266,11 @@ capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1310,6 +1369,15 @@ cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -1331,6 +1399,13 @@ color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + commander@^2.11.0, commander@^2.5.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" @@ -1343,6 +1418,21 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concurrently@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz#17fdf067da71210685d9ea554423ef239da30d33" + integrity sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg== + dependencies: + chalk "^2.4.1" + date-fns "^1.23.0" + lodash "^4.17.10" + read-pkg "^4.0.1" + rxjs "^6.3.3" + spawn-command "^0.0.2-1" + supports-color "^4.5.0" + tree-kill "^1.1.0" + yargs "^12.0.1" + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1388,7 +1478,7 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3, core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1428,7 +1518,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1456,6 +1546,18 @@ css-what@2.1: version "2.1.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.23.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== + date-fns@^2.0.0-alpha.24: version "2.0.0-alpha.24" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-alpha.24.tgz#2988c137c72275af29d7d21cc53eb52b3a8c2586" @@ -1472,6 +1574,11 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1505,6 +1612,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -1599,6 +1711,14 @@ duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ecdsa-sig-formatter@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" @@ -1627,6 +1747,13 @@ entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" @@ -1686,6 +1813,19 @@ events@1.1.1: version "1.1.1" resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -1770,6 +1910,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^2.0.1: version "2.2.0" resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -1797,10 +1942,25 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + faker@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -1850,6 +2010,13 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + flatmap-stream@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.1.tgz#d34f39ef3b9aa5a2fc225016bd3adf28ac5ae6ea" @@ -1864,6 +2031,20 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -1920,6 +2101,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-stream@^3.0.0: version "3.0.0" resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -1928,6 +2114,13 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2157,12 +2350,30 @@ graphql-yoga@1.16.2: dependencies: iterall "^1.2.1" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" dependencies: ansi-regex "^2.0.0" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2219,6 +2430,16 @@ he@0.5.0: version "0.5.0" resolved "http://registry.npmjs.org/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" +hoek@5.x.x: + version "5.0.4" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" + integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== + +hoek@6.x.x: + version "6.0.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.0.3.tgz#7884360426d927865a0a1251fc9c59313af5b798" + integrity sha512-TU6RyZ/XaQCTWRLrdqZZtZqwxUVr6PDMfi6MlWNURZ7A6czanQqX4pFE1mdOUQR9FdPCsZ0UzL8jI/izZ+eBSQ== + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -2226,6 +2447,11 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + htmlparser2@^3.9.0, htmlparser2@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" @@ -2246,6 +2472,15 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -2334,6 +2569,11 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -2350,6 +2590,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -2360,6 +2605,13 @@ is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -2543,6 +2795,11 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2555,6 +2812,13 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isemail@3.x.x: + version "3.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" + integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== + dependencies: + punycode "2.x.x" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2569,6 +2833,11 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + iterall@^1.1.3, iterall@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" @@ -2577,6 +2846,15 @@ jmespath@0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" +joi@^13.0.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" + integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== + dependencies: + hoek "5.x.x" + isemail "3.x.x" + topo "3.x.x" + jquery@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" @@ -2596,6 +2874,11 @@ js-yaml@^3.10.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -2604,6 +2887,26 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + json5@^0.5.1: version "0.5.1" resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2622,6 +2925,16 @@ jsonwebtoken@^8.2.0, jsonwebtoken@^8.3.0: lodash.once "^4.0.0" ms "^2.1.1" +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + jwa@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" @@ -2663,6 +2976,13 @@ latest-version@^3.0.0: dependencies: package-json "^4.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + linkifyjs@^2.1.7: version "2.1.7" resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.7.tgz#e5d68d2ae30b9c055e1d74cc40f9a31d3abb4012" @@ -2671,6 +2991,14 @@ linkifyjs@^2.1.7: react "^16.4.2" react-dom "^16.4.2" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -2746,6 +3074,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -2768,6 +3103,15 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -2816,6 +3160,18 @@ mime-db@~1.36.0: version "1.36.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" + mime-types@~2.1.18: version "2.1.20" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" @@ -3000,6 +3356,16 @@ nopt@~1.0.10: dependencies: abbrev "1" +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -3046,6 +3412,11 @@ numeral@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3142,6 +3513,15 @@ os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3161,10 +3541,39 @@ output-file-sync@^1.1.2: mkdirp "^0.5.1" object-assign "^4.1.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -3183,6 +3592,14 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -3219,6 +3636,11 @@ path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3245,6 +3667,11 @@ pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -3329,6 +3756,11 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== + pstree.remy@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" @@ -3339,11 +3771,16 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" -punycode@^2.1.0: +punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -qs@6.5.2: +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -3399,6 +3836,15 @@ react@^16.4.2: prop-types "^15.6.2" scheduler "^0.10.0" +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + readable-stream@1.1.x: version "1.1.14" resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -3522,6 +3968,42 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request@^2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -3557,6 +4039,13 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rxjs@^6.3.3: + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -3567,7 +4056,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -3607,7 +4096,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -3638,7 +4127,7 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -3750,6 +4239,37 @@ source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + +spdx-correct@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" + integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -3773,6 +4293,21 @@ srcset@^1.0.0: array-uniq "^1.0.2" number-is-nan "^1.0.0" +sshpk@^1.7.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" + integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -3858,6 +4393,13 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= + dependencies: + has-flag "^2.0.0" + supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -3926,12 +4468,32 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +topo@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" + integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ== + dependencies: + hoek "6.x.x" + touch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" dependencies: nopt "~1.0.10" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tree-kill@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" + integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -3948,6 +4510,23 @@ trunc-text@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trunc-text/-/trunc-text-1.0.1.tgz#58f876d8ac59b224b79834bb478b8656e69622b5" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + type-is@^1.6.16, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -4014,7 +4593,7 @@ update-notifier@^2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" -uri-js@^4.2.1: +uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -4064,7 +4643,7 @@ uuid@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -uuid@^3.1.0: +uuid@^3.1.0, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -4074,14 +4653,47 @@ v8flags@^2.1.1: dependencies: user-home "^1.1.1" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wait-on@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-3.2.0.tgz#c83924df0fc42a675c678324c49c769d378bcb85" + integrity sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg== + dependencies: + core-js "^2.5.7" + joi "^13.0.0" + minimist "^1.2.0" + request "^2.88.0" + rx "^4.1.0" + whatwg-fetch@2.0.4: version "2.0.4" resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -4100,6 +4712,14 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4137,6 +4757,11 @@ xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +"y18n@^3.2.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -4145,6 +4770,32 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^12.0.1: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + zen-observable-ts@^0.8.10: version "0.8.10" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.10.tgz#18e2ce1c89fe026e9621fd83cc05168228fce829" From 859b2b87790f6172bed27596df6947615cd57f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Tue, 20 Nov 2018 21:06:56 +0100 Subject: [PATCH 05/29] Reactivate isOwner as suggested in the comments --- src/middleware/permissionsMiddleware.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index d82be9f5b..2eaac524a 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -24,11 +24,10 @@ const permissions = shield({ // addFruitToBasket: isAuthenticated CreateUser: allow }, - // TODO: re-activate this after fixing the initial seed - // User: { - // email: isOwner, - // password: isOwner - // }, + User: { + email: isOwner, + password: isOwner + }, Post: isAuthenticated }) From ab78785a43438572b8c735c94d46f7f98c0faaf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Tue, 20 Nov 2018 22:00:31 +0100 Subject: [PATCH 06/29] Add the remaining seeds --- src/seed/data/index.js | 3 +- .../miscellaneous.js} | 80 +------------------ src/seed/seed-db.js | 1 - 3 files changed, 5 insertions(+), 79 deletions(-) rename src/seed/{seed-mutations.js => data/miscellaneous.js} (85%) diff --git a/src/seed/data/index.js b/src/seed/data/index.js index 0ac7681aa..5082f50e3 100644 --- a/src/seed/data/index.js +++ b/src/seed/data/index.js @@ -4,7 +4,8 @@ import helper from '../seed-helpers' const seed = { Badges: require('./badges.js').default, User: require('./users.js').default, - UserBadges: require('./users-badges.js').default + UserBadges: require('./users-badges.js').default, + Miscellaneous: require('./miscellaneous.js').default }; let data = {} diff --git a/src/seed/seed-mutations.js b/src/seed/data/miscellaneous.js similarity index 85% rename from src/seed/seed-mutations.js rename to src/seed/data/miscellaneous.js index 8431e3c59..808b29479 100644 --- a/src/seed/seed-mutations.js +++ b/src/seed/data/miscellaneous.js @@ -1,86 +1,11 @@ import faker from 'faker' -export default ` - mutation { +export default () => { + return `mutation { - # Users - u1: CreateUser( - id: "u1", - name: "Peter Lustig", - password: "1234", - email: "admin@example.org", - avatar: "${faker.internet.avatar()}", - role: admin, - disabled: false, - deleted: false) { - id - name - email - avatar - role - } - u2: CreateUser( - id: "u2", - name: "Bob der Bausmeister", - password: "1234", - email: "moderator@example.org", - avatar: "${faker.internet.avatar()}", - role: moderator, - disabled: false, - deleted: false) { - id - name - email - avatar - role - } - u3: CreateUser( - id: "u3", - name: "Jenny Rostock", - password: "1234", - email: "user@example.org", - avatar: "${faker.internet.avatar()}", - role: user, - disabled: false, - deleted: false) { - id - name - email - avatar - role - } - u4: CreateUser( - id: "u4", - name: "Angie Banjie", - password: "1234", - email: "angie@example.org", - avatar: "${faker.internet.avatar()}", - role: user, - disabled: false, - deleted: false) { - id - name - email - avatar - role - } u1_blacklist_u4: AddUserBlacklisted(from: { id: "u1" }, to: { id: "u4" }) { from { id } } - # Badges - b1: CreateBadge(id: "b1", key: "indiegogo_en_racoon", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_racoon.svg") { id } - b2: CreateBadge(id: "b2", key: "indiegogo_en_rabbit", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rabbit.svg") { id } - b3: CreateBadge(id: "b3", key: "indiegogo_en_wolf", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_wolf.svg") { id } - b4: CreateBadge(id: "b4", key: "indiegogo_en_bear", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_bear.svg") { id } - b5: CreateBadge(id: "b5", key: "indiegogo_en_turtle", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_turtle.svg") { id } - b6: CreateBadge(id: "b6", key: "indiegogo_en_rhino", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rhino.svg") { id } - - b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } - b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } - b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } - b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } - b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } - b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } # categories cat1: CreateCategory( id: "cat1", name: "Just For Fun", slug: "justforfun", icon: "categories-justforfun" ) { name } @@ -418,3 +343,4 @@ export default ` ) { from { id } } } ` +} diff --git a/src/seed/seed-db.js b/src/seed/seed-db.js index 0617a53fe..7ffb2c4dd 100644 --- a/src/seed/seed-db.js +++ b/src/seed/seed-db.js @@ -1,7 +1,6 @@ import ApolloClient from "apollo-client"; import dotenv from "dotenv"; import gql from 'graphql-tag' -import seedMutations from "./seed-mutations"; import fetch from "node-fetch"; import { HttpLink } from "apollo-link-http"; import { InMemoryCache } from "apollo-cache-inmemory"; From c6420b535139e0a18f2e2e29c3d0cb409a691ed7 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Wed, 21 Nov 2018 15:16:55 +0100 Subject: [PATCH 07/29] simplyfied schema and modulized seeding process --- package.json | 2 +- src/bootstrap/neo4j.js | 20 +++++ src/index.js | 10 +-- src/middleware/index.js | 2 +- src/middleware/permissionsMiddleware.js | 28 +----- src/middleware/softDeleteMiddleware.js | 12 +-- src/schema.graphql | 27 ++---- src/seed/data/categories.js | 22 +++++ src/seed/data/comments.js | 80 +++++++++++++++++ src/seed/data/index.js | 14 ++- src/seed/data/posts.js | 112 ++++++++++++++++++++++++ src/seed/data/tags.js | 22 +++++ src/seed/data/users-badges.js | 7 +- src/seed/data/users-blacklist.js | 12 +++ src/seed/data/users-follows.js | 26 ++++++ src/seed/data/users-friends.js | 14 +++ src/seed/data/users-shouts.js | 30 +++++++ src/seed/seed-db.js | 12 +-- src/seed/seed-mutations.js | 4 - 19 files changed, 375 insertions(+), 81 deletions(-) create mode 100644 src/bootstrap/neo4j.js create mode 100644 src/seed/data/categories.js create mode 100644 src/seed/data/comments.js create mode 100644 src/seed/data/posts.js create mode 100644 src/seed/data/tags.js create mode 100644 src/seed/data/users-blacklist.js create mode 100644 src/seed/data/users-follows.js create mode 100644 src/seed/data/users-friends.js create mode 100644 src/seed/data/users-shouts.js diff --git a/package.json b/package.json index c671b12aa..33cb7461a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "./node_modules/.bin/nodemon --exec babel-node src/index.js", "start:debug": "./node_modules/.bin/nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js", - "seedDb": "cross-env IS_SEEDING='true' ./node_modules/.bin/babel-node src/seed/seed-db.js && cross-env IS_SEEDING=false" + "db:seed": "./node_modules/.bin/babel-node src/seed/seed-db.js" }, "author": "Grzegorz Leoniec", "license": "MIT", diff --git a/src/bootstrap/neo4j.js b/src/bootstrap/neo4j.js new file mode 100644 index 000000000..9b17361fa --- /dev/null +++ b/src/bootstrap/neo4j.js @@ -0,0 +1,20 @@ +import { v1 as neo4j } from 'neo4j-driver' + +let driver + +export default function () { + return { + getDriver() { + if (!driver) { + driver = neo4j.driver( + process.env.NEO4J_URI || 'bolt://localhost:7687', + neo4j.auth.basic( + process.env.NEO4J_USER || 'neo4j', + process.env.NEO4J_PASSWORD || 'neo4j' + ) + ) + } + return driver + } + } +} diff --git a/src/index.js b/src/index.js index 5c3face1a..9530ee121 100644 --- a/src/index.js +++ b/src/index.js @@ -2,12 +2,12 @@ import { GraphQLServer } from 'graphql-yoga' import { makeExecutableSchema } from 'apollo-server' import { augmentSchema } from 'neo4j-graphql-js' import { typeDefs, resolvers } from './graphql-schema' -import { v1 as neo4j } from 'neo4j-driver' import dotenv from 'dotenv' import mocks from './mocks' import middleware from './middleware' import applyDirectives from './bootstrap/directives' import applyScalars from './bootstrap/scalars' +import neo4j from './bootstrap/neo4j' import passport from 'passport' import jwtStrategy from './jwt/strategy' @@ -20,13 +20,7 @@ let schema = makeExecutableSchema({ resolvers }) -const driver = neo4j.driver( - process.env.NEO4J_URI || 'bolt://localhost:7687', - neo4j.auth.basic( - process.env.NEO4J_USER || 'neo4j', - process.env.NEO4J_PASSWORD || 'neo4j' - ) -) +const driver = neo4j().getDriver() const MOCK = (process.env.MOCK === 'true') console.log('MOCK:', MOCK) diff --git a/src/middleware/index.js b/src/middleware/index.js index f743ae74f..819d51055 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -8,7 +8,7 @@ import xssMiddleware from './xssMiddleware'; import permissionsMiddleware from './permissionsMiddleware'; export default schema => [ - permissionsMiddleware.generate(schema), + // permissionsMiddleware.generate(schema), passwordMiddleware, dateTimeMiddleware, sluggifyMiddleware, diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index 0386994cc..68206d24d 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -1,36 +1,16 @@ import { rule, shield, and, or, not, allow } from 'graphql-shield' const isAuthenticated = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user !== null }) const isOwner = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } console.log('parent', parent) return ctx.user.id === parent.id }) const isAdmin = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user.role === 'ADMIN' }) const isModerator = rule()(async (parent, args, ctx, info) => { - // TODO: how to get this working while seeding? - console.log('isSeeding', process.env.IS_SEEDING) - if (process.env.IS_SEEDING === true) { - return true - } return ctx.user.role === 'MODERATOR' }) @@ -46,10 +26,10 @@ const permissions = shield({ CreateUser: allow }, // TODO: re-activate this after fixing the initial seed - // User: { - // email: isOwner, - // password: isOwner - // }, + User: { + email: isOwner, + password: isOwner + }, Post: isAuthenticated }) diff --git a/src/middleware/softDeleteMiddleware.js b/src/middleware/softDeleteMiddleware.js index c413961bc..79e4a7d08 100644 --- a/src/middleware/softDeleteMiddleware.js +++ b/src/middleware/softDeleteMiddleware.js @@ -11,12 +11,12 @@ export default { return result }, Comment: async (resolve, root, args, context, info) => { - // if (typeof args.deleted !== 'boolean') { - // args.deleted = false - // } - // if (typeof args.disabled !== 'boolean') { - // args.disabled = false - // } + if (typeof args.deleted !== 'boolean') { + args.deleted = false + } + if (typeof args.disabled !== 'boolean') { + args.disabled = false + } const result = await resolve(root, args, context, info) return result }, diff --git a/src/schema.graphql b/src/schema.graphql index e6bb4f350..f5f58818b 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -44,21 +44,6 @@ enum UserGroupEnum { user } -type WrittenPost @relation(name: "WROTE") { - from: User - to: Post - timestamp: Int # TODO: change that to custom Date Type -} -# type WrittenPost2 { -# Post: Post! -# timestamp: Int # TODO: change that to custom Date Type -# } -type WrittenComment @relation(name: "WROTE") { - from: User - to: Comment - timestamp: Int # TODO: change that to custom Date Type -} - type User { id: ID! name: String @@ -94,7 +79,7 @@ type User { RETURN COUNT(r)""" ) - comments: [WrittenComment]! + comments: [Comment]! @relation(name: "WROTE", direction: "OUT") commentsCount: Int! @cypher(statement: "MATCH (this)-[:WROTE]->(r:Comment) WHERE NOT r.deleted = true RETURN COUNT(r)") shouted: [Post]! @relation(name: "SHOUTED", direction: "OUT") @@ -111,7 +96,7 @@ type User { type Post { id: ID! - author: WrittenPost + author: User @relation(name: "WROTE", direction: "IN") title: String! slug: String content: String! @@ -141,12 +126,12 @@ type Post { type Comment { id: ID! - author: WrittenComment + author: User @relation(name: "WROTE", direction: "IN") content: String! contentExcerpt: String - post: Post @relation(name: "COMMENT", direction: "OUT") - createdAt: String, - updatedAt: String, + post: Post @relation(name: "COMMENTS", direction: "OUT") + createdAt: String + updatedAt: String deleted: Boolean disabled: Boolean } diff --git a/src/seed/data/categories.js b/src/seed/data/categories.js new file mode 100644 index 000000000..c070d5056 --- /dev/null +++ b/src/seed/data/categories.js @@ -0,0 +1,22 @@ +export default function (data) { + return ` + mutation { + cat1: CreateCategory( id: "cat1", name: "Just For Fun", slug: "justforfun", icon: "categories-justforfun" ) { name } + cat2: CreateCategory( id: "cat2", name: "Happyness & Values", slug: "happyness-values", icon: "categories-luck" ) { name } + cat3: CreateCategory( id: "cat3", name: "Health & Wellbeing", slug: "health-wellbeing", icon: "categories-health" ) { name } + cat4: CreateCategory( id: "cat4", name: "Environment & Nature", slug: "environment-nature", icon: "categories-environment" ) { name } + cat5: CreateCategory( id: "cat5", name: "Animal Protection", slug: "animalprotection", icon: "categories-animal-justice" ) { name } + cat6: CreateCategory( id: "cat6", name: "Humanrights Justice", slug: "humanrights-justice", icon: "categories-human-rights" ) { name } + cat7: CreateCategory( id: "cat7", name: "Education & Sciences", slug: "education-sciences", icon: "categories-education" ) { name } + cat8: CreateCategory( id: "cat8", name: "Cooperation & Development", slug: "cooperation-development", icon: "categories-cooperation" ) { name } + cat9: CreateCategory( id: "cat9", name: "Democracy & Politics", slug: "democracy-politics", icon: "categories-politics" ) { name } + cat10: CreateCategory( id: "cat10", name: "Economy & Finances", slug: "economy-finances", icon: "categories-economy" ) { name } + cat11: CreateCategory( id: "cat11", name: "Energy & Technology", slug: "energy-technology", icon: "categories-technology" ) { name } + cat12: CreateCategory( id: "cat12", name: "IT, Internet & Data Privacy", slug: "it-internet-dataprivacy", icon: "categories-internet" ) { name } + cat13: CreateCategory( id: "cat13", name: "Art, Curlure & Sport", slug: "art-culture-sport", icon: "categories-art" ) { name } + cat14: CreateCategory( id: "cat14", name: "Freedom of Speech", slug: "freedomofspeech", icon: "categories-freedom-of-speech" ) { name } + cat15: CreateCategory( id: "cat15", name: "Consumption & Sustainability", slug: "consumption-sustainability", icon: "categories-sustainability" ) { name } + cat16: CreateCategory( id: "cat16", name: "Global Peace & Nonviolence", slug: "globalpeace-nonviolence", icon: "categories-peace" ) { name } + } + ` +} diff --git a/src/seed/data/comments.js b/src/seed/data/comments.js new file mode 100644 index 000000000..ac1849b86 --- /dev/null +++ b/src/seed/data/comments.js @@ -0,0 +1,80 @@ +import faker from 'faker' + +/** + * TODO: add a comment automatically to the correct post and relate it to the current user + */ +export default function (data) { + return ` + mutation { + c1: CreateComment( + id: "c1", + content: "

da stimm ich dir zu. Mir ging das auch nie in den kopf, und hatte jesus nie als gott gesehen

" + ) { id } + c1_u1: AddCommentAuthor(from: { id: "u3" }, to: { id: "c1" }) { from { id } } + c1_p1: AddCommentPost( + from: { id: "c1" }, + to: { id: "p1" } + ) { from { id } } + + c2: CreateComment( + id: "c2", + content: "

Schön das es dich gibt ❤️❤️❤️❤️❤️❤️❤️❤️❤️

" + ) { id } + c2_u1: AddCommentAuthor(from: { id: "u1" }, to: { id: "c2" }) { from { id } } + c2_p1: AddCommentPost( + from: { id: "c2" }, + to: { id: "p1" } + ) { from { id } } + + c3: CreateComment( + id: "c3", + content: "

Hi Dieter,

danke für Deine Info. Hast Du mal ein Foto von Deinem Cabrio mit dem Logo drauf?

" + ) { id } + c3_u2: AddCommentAuthor(from: { id: "u1" }, to: { id: "c3" }) { from { id } } + c3_p3: AddCommentPost( + from: { id: "c3" }, + to: { id: "p3" } + ) { from { id } } + + c4: CreateComment( + id: "c4", + content: "

Das Zusammenführen aller Gruppen, die mit uns am gleichen Strang in die gleiche Richtung ziehen, in eine gemeinsame Adressenstruktur sehe ich auch als Haupt - Aufgabe für unsere neue Netzwerkbildung an.

" + ) { id } + c4_u3: AddCommentAuthor(from: { id: "u4" }, to: { id: "c4" }) { from { id } } + c4_p2: AddCommentPost( + from: { id: "c4" }, + to: { id: "p2" } + ) { from { id } } + + c5: CreateComment( + id: "c5", + content: "${faker.lorem.paragraph()}" + ) { id } + c5_u4: AddCommentAuthor(from: { id: "u4" }, to: { id: "c5" }) { from { id } } + c5_p3: AddCommentPost( + from: { id: "c5" }, + to: { id: "p3" } + ) { from { id } } + + c6: CreateComment( + id: "c6", + content: "${faker.lorem.paragraph()}" + ) { id } + c6_u3: AddCommentAuthor(from: { id: "u3" }, to: { id: "c6" }) { from { id } } + c6_p4: AddCommentPost( + from: { id: "c6" }, + to: { id: "p4" } + ) { from { id } } + + c7: CreateComment( + id: "c7", + content: "${faker.lorem.paragraph()}" + ) { id } + c7_u2: AddCommentAuthor(from: { id: "u2" }, to: { id: "c7" }) { from { id } } + c7_p2: AddCommentPost( + from: { id: "c7" }, + to: { id: "p2" } + ) { from { id } } + } + ` +} diff --git a/src/seed/data/index.js b/src/seed/data/index.js index 0ac7681aa..c65fb431c 100644 --- a/src/seed/data/index.js +++ b/src/seed/data/index.js @@ -2,9 +2,19 @@ import gql from 'graphql-tag' import helper from '../seed-helpers' const seed = { - Badges: require('./badges.js').default, + Badge: require('./badges.js').default, + Category: require('./categories.js').default, + Tags: require('./tags.js').default, + User: require('./users.js').default, - UserBadges: require('./users-badges.js').default + UserBadges: require('./users-badges.js').default, + UserBlacklist: require('./users-blacklist.js').default, + UserFollows: require('./users-follows.js').default, + UserFriends: require('./users-friends.js').default, + + Post: require('./posts.js').default, + Comment: require('./comments.js').default, + UserShouts: require('./users-shouts.js').default }; let data = {} diff --git a/src/seed/data/posts.js b/src/seed/data/posts.js new file mode 100644 index 000000000..e94f63f69 --- /dev/null +++ b/src/seed/data/posts.js @@ -0,0 +1,112 @@ +import faker from 'faker' + +export default function (data) { + return ` + mutation { + p1: CreatePost( + id: "p1", + title: "Gedanken eines Polizisten zum Einsatz im Hambacher Forst", + content: "

Diese Zukunftsstadt ist real und keine Computer-Animation – sondern sie ist das Lebenswerk des mittlerweile über 100 Jahre alten Futuristen und Architekten Jacque Fresco aus Florida. In 35 Jahren (seit seinem 13. Lebensjahr) hat dieser zusammen mit seiner Frau seinen futuristischen Traum von einer besonderen Zukunftsstadt auf 85.000 Quadratmetern realisiert. In den Gebäuden und Gärten befinden sich u.a. ein Forschungszentrum, Vortragsräume und unzählige seiner Modelle & Architekturentwürfe.


Sein zentrales Anliegen ist eine resourcenbasierte Wirtschaft und die Abschaffung von Geld und Privatbesitz. Mit Hilfe von Roboterarbeit und dem Bedingungslosen Grundeinkommen (da nach seiner Ansicht in den kommenden Jahren fast alle Jobs automatisiert werden), möchte er eine ökologische Landwirtschaft mit Permakulturen etc. und eine effiziente Energiegewinnung (ausschließlich durch regenerative Energien) schaffen. Wenige kompatible Formen in einer sparsamen Modulbauweise (in die u.a. bereits variable Service- und Reparaturelemente integriert sind) sollen insgesamt eine soziale & ökologische Utopie im Einklang mit der Natur ermöglichen.


Nachfolgend der Direkt-Link auf den interessanten Artikel von Zoltan Istvan, der den Architekten und seine Frau in Florida besuchen durfte und seinen Artikel Ende 2016 auf „MOTHERBOARD“ veröffentlicht hatte:


https://motherboard.vice.com/de/article/vv34nb/ich-habe-die-zukunft-besucht-in-der-wir-ohne-geld-steuern-und-besitz-leben 


Da soll noch jemand behaupten, es gäbe keine Utopien mehr bzw. keine Futuristen, die ihre kreativen und zukunftsfähigen Ideen (auch in ganz großem Stil) selbst in die Tat umsetzen. LG @all :) 


Wir sind eine Menschheitsfamilie. • Wir sind eins. • Wir sind HUMAN CONNECTION ❤️

", + image: "https://picsum.photos/1280/1024?image=352", + visibility: public, + disabled: false, + deleted: false + ) { title } + p1_cat1: AddPostCategories(from: {id: "p1"}, to: {id: "cat1"}) { from { id } } + p1_cat2: AddPostCategories(from: {id: "p1"}, to: {id: "cat2"}) { from { id } } + ur1: AddUserContributions(from: { id: "u1" }, to: { id: "p1" }) { from { id } } + p1_t1: AddPostTags( + from: { id: "p1" } + to: { id: "t1" } + ) { from { id } } + p1_t2: AddPostTags( + from: { id: "p1" } + to: { id: "t2" } + ) { from { id } } + p1_t3: AddPostTags( + from: { id: "p1" } + to: { id: "t3" } + ) { from { id } } + + p2: CreatePost( + id: "p2", + title: "Julian Assange", + content: "

Diese Zukunftsstadt ist real und keine Computer-Animation – sondern sie ist das Lebenswerk des mittlerweile über 100 Jahre alten Futuristen und Architekten Jacque Fresco aus Florida. In 35 Jahren (seit seinem 13. Lebensjahr) hat dieser zusammen mit seiner Frau seinen futuristischen Traum von einer besonderen Zukunftsstadt auf 85.000 Quadratmetern realisiert. In den Gebäuden und Gärten befinden sich u.a. ein Forschungszentrum, Vortragsräume und unzählige seiner Modelle & Architekturentwürfe.


Sein zentrales Anliegen ist eine resourcenbasierte Wirtschaft und die Abschaffung von Geld und Privatbesitz. Mit Hilfe von Roboterarbeit und dem Bedingungslosen Grundeinkommen (da nach seiner Ansicht in den kommenden Jahren fast alle Jobs automatisiert werden), möchte er eine ökologische Landwirtschaft mit Permakulturen etc. und eine effiziente Energiegewinnung (ausschließlich durch regenerative Energien) schaffen. Wenige kompatible Formen in einer sparsamen Modulbauweise (in die u.a. bereits variable Service- und Reparaturelemente integriert sind) sollen insgesamt eine soziale & ökologische Utopie im Einklang mit der Natur ermöglichen.


Nachfolgend der Direkt-Link auf den interessanten Artikel von Zoltan Istvan, der den Architekten und seine Frau in Florida besuchen durfte und seinen Artikel Ende 2016 auf „MOTHERBOARD“ veröffentlicht hatte:


https://motherboard.vice.com/de/article/vv34nb/ich-habe-die-zukunft-besucht-in-der-wir-ohne-geld-steuern-und-besitz-leben 


Da soll noch jemand behaupten, es gäbe keine Utopien mehr bzw. keine Futuristen, die ihre kreativen und zukunftsfähigen Ideen (auch in ganz großem Stil) selbst in die Tat umsetzen. LG @all :) 


Wir sind eine Menschheitsfamilie. • Wir sind eins. • Wir sind HUMAN CONNECTION ❤️

", + image: "https://picsum.photos/1280/1024?image=72", + visibility: public, + disabled: false, + deleted: false + ) { title } + p2_cat1: AddPostCategories(from: {id: "p2"}, to: {id: "cat1"}) { from { id } } + p2_cat16: AddPostCategories(from: {id: "p2"}, to: {id: "cat16"}) { from { id } } + ur2: AddUserContributions(from: { id: "u2" }, to: { id: "p2" }) { from { id } } + p2_t4: AddPostTags( + from: { id: "p2" } + to: { id: "t4" } + ) { from { id } } + + p3: CreatePost( + id: "p3", + title: "Hacker, Freaks und Funktionäre...Der CCC", + content: "${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()}", + image: "https://picsum.photos/1280/1024?image=121", + visibility: public, + disabled: false, + deleted: false + ) { title } + p3_cat1: AddPostCategories(from: {id: "p3"}, to: {id: "cat1"}) { from { id } } + p3_cat3: AddPostCategories(from: {id: "p3"}, to: {id: "cat3"}) { from { id } } + p3_cat14: AddPostCategories(from: {id: "p3"}, to: {id: "cat14"}) { from { id } } + ur3: AddUserContributions(from: { id: "u3" }, to: { id: "p3" }) { from { id } } + p3_t2: AddPostTags( + from: { id: "p3" } + to: { id: "t2" } + ) { from { id } } + p3_t4: AddPostTags( + from: { id: "p3" } + to: { id: "t4" } + ) { from { id } } + + p4: CreatePost( + id: "p4", + title: "Lebensmittel (?)", + content: "${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()}", + image: "https://picsum.photos/1280/1024?image=142", + visibility: public, + disabled: false, + deleted: false + ) { title } + p4_cat1: AddPostCategories(from: {id: "p4"}, to: {id: "cat1"}) { from { id } } + p4_cat9: AddPostCategories(from: {id: "p4"}, to: {id: "cat9"}) { from { id } } + p4_cat4: AddPostCategories(from: {id: "p4"}, to: {id: "cat4"}) { from { id } } + ur4: AddUserContributions(from: { id: "u4" }, to: { id: "p4" }) { from { id } } + + p5: CreatePost( + id: "p5", + title: "${faker.lorem.sentence()}", + content: "${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()}", + image: "https://picsum.photos/1280/1024?image=231", + visibility: public, + disabled: false, + deleted: false + ) { title } + p5_cat8: AddPostCategories(from: {id: "p5"}, to: {id: "cat8"}) { from { id } } + p5_cat12: AddPostCategories(from: {id: "p5"}, to: {id: "cat12"}) { from { id } } + ur5: AddUserContributions(from: { id: "u2" }, to: { id: "p5" }) { from { id } } + + p6: CreatePost( + id: "p6", + title: "${faker.lorem.sentence()}", + content: "${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()} ${faker.lorem.sentence()}", + image: "https://picsum.photos/1280/1024?image=424", + visibility: public, + disabled: false, + deleted: false + ) { title } + p6_cat1: AddPostCategories(from: {id: "p6"}, to: {id: "cat1"}) { from { id } } + p6_cat2: AddPostCategories(from: {id: "p6"}, to: {id: "cat2"}) { from { id } } + p6_cat5: AddPostCategories(from: {id: "p6"}, to: {id: "cat5"}) { from { id } } + ur6: AddUserContributions(from: { id: "u4" }, to: { id: "p6" }) { from { id } } + } + ` +} diff --git a/src/seed/data/tags.js b/src/seed/data/tags.js new file mode 100644 index 000000000..be4b3da90 --- /dev/null +++ b/src/seed/data/tags.js @@ -0,0 +1,22 @@ +export default function (data) { + return ` + mutation { + t1: CreateTag( + id: "t1", + name: "Umwelt" + ) { name } + t2: CreateTag( + id: "t2", + name: "Naturschutz" + ) { name } + t3: CreateTag( + id: "t3", + name: "Demokratie" + ) { name } + t4: CreateTag( + id: "t4", + name: "Freiheit" + ) { name } + } + ` +} diff --git a/src/seed/data/users-badges.js b/src/seed/data/users-badges.js index 1a8bc1fe1..e303c6157 100644 --- a/src/seed/data/users-badges.js +++ b/src/seed/data/users-badges.js @@ -1,12 +1,7 @@ export default function (data) { return ` mutation { - b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } - b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } - b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } - b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } - b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } - b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } + u1_blacklist_u4: AddUserBlacklisted(from: { id: "u1" }, to: { id: "u4" }) { from { id } } } ` } diff --git a/src/seed/data/users-blacklist.js b/src/seed/data/users-blacklist.js new file mode 100644 index 000000000..1a8bc1fe1 --- /dev/null +++ b/src/seed/data/users-blacklist.js @@ -0,0 +1,12 @@ +export default function (data) { + return ` + mutation { + b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } + b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } + b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } + b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } + b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } + b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } + } + ` +} diff --git a/src/seed/data/users-follows.js b/src/seed/data/users-follows.js new file mode 100644 index 000000000..af6467e7f --- /dev/null +++ b/src/seed/data/users-follows.js @@ -0,0 +1,26 @@ +export default function (data) { + return ` + mutation { + u1_follow_u2: AddUserFollowing( + from: { id: "u1" }, + to: { id: "u2" } + ) { from { id } } + u2_follow_u1: AddUserFollowing( + from: { id: "u2" }, + to: { id: "u1" } + ) { from { id } } + u2_follow_u3: AddUserFollowing( + from: { id: "u2" }, + to: { id: "u3" } + ) { from { id } } + u2_follow_u4: AddUserFollowing( + from: { id: "u2" }, + to: { id: "u4" } + ) { from { id } } + u4_follow_u2: AddUserFollowing( + from: { id: "u4" }, + to: { id: "u2" } + ) { from { id } } + } + ` +} diff --git a/src/seed/data/users-friends.js b/src/seed/data/users-friends.js new file mode 100644 index 000000000..33d7db7e4 --- /dev/null +++ b/src/seed/data/users-friends.js @@ -0,0 +1,14 @@ +export default function (data) { + return ` + mutation { + u1_friends_u2: AddUserFriends( + from: { id: "u1" }, + to: { id: "u2" } + ) { from { id } } + u1_friends_u3: AddUserFriends( + from: { id: "u1" }, + to: { id: "u3" } + ) { from { id } } + } + ` +} diff --git a/src/seed/data/users-shouts.js b/src/seed/data/users-shouts.js new file mode 100644 index 000000000..9c0f2d1bf --- /dev/null +++ b/src/seed/data/users-shouts.js @@ -0,0 +1,30 @@ +export default function (data) { + return ` + mutation { + u1s2: AddUserShouted( + from: { id: "u1" }, + to: { id: "p2" } + ) { from { id } } + u1s3: AddUserShouted( + from: { id: "u1" }, + to: { id: "p3" } + ) { from { id } } + u2s1: AddUserShouted( + from: { id: "u2" }, + to: { id: "p1" } + ) { from { id } } + u3s1: AddUserShouted( + from: { id: "u3" }, + to: { id: "p1" } + ) { from { id } } + u3s4: AddUserShouted( + from: { id: "u3" }, + to: { id: "p4" } + ) { from { id } } + u4s1: AddUserShouted( + from: { id: "u4" }, + to: { id: "p1" } + ) { from { id } } + } + ` +} diff --git a/src/seed/seed-db.js b/src/seed/seed-db.js index 0617a53fe..df6999426 100644 --- a/src/seed/seed-db.js +++ b/src/seed/seed-db.js @@ -1,7 +1,6 @@ import ApolloClient from "apollo-client"; import dotenv from "dotenv"; import gql from 'graphql-tag' -import seedMutations from "./seed-mutations"; import fetch from "node-fetch"; import { HttpLink } from "apollo-link-http"; import { InMemoryCache } from "apollo-cache-inmemory"; @@ -9,16 +8,13 @@ import Seed from './data/index' dotenv.config(); +if (process.env.NODE_ENV === 'production') { + throw new Error('YOU CAN`T SEED IN PRODUCTION MODE') +} + const client = new ApolloClient({ link: new HttpLink({ uri: process.env.GRAPHQL_URI, fetch }), cache: new InMemoryCache() }); Seed(client) - -/* client - .mutate({ - mutation: gql(seedMutations) - }) - .then(data => console.log(data)) - .catch(error => console.error(error)); **/ diff --git a/src/seed/seed-mutations.js b/src/seed/seed-mutations.js index 8431e3c59..6a06675a6 100644 --- a/src/seed/seed-mutations.js +++ b/src/seed/seed-mutations.js @@ -263,10 +263,6 @@ export default ` from: { id: "c6" }, to: { id: "p4" } ) { from { id } } - c6_p1: AddCommentPost( - from: { id: "c6" }, - to: { id: "p1" } - ) { from { id } } c7_p2: AddCommentPost( from: { id: "c7" }, to: { id: "p2" } From fa2c3fc24bf4e7405a5adfc8341f73871b927aba Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Wed, 21 Nov 2018 15:30:26 +0100 Subject: [PATCH 08/29] shortened GRAPHQL_LISTEN_PORT to GRAPHQL_PORT --- .env.template | 2 +- docker-compose.yml | 2 +- kubernetes/backend-deployment.yaml | 2 +- package.json | 2 +- src/index.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.env.template b/.env.template index df678a343..59ae471c9 100644 --- a/.env.template +++ b/.env.template @@ -1,7 +1,7 @@ NEO4J_URI=bolt://localhost:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=letmein -GRAPHQL_LISTEN_PORT=4000 +GRAPHQL_PORT=4000 GRAPHQL_URI=http://localhost:4000 MOCK=false diff --git a/docker-compose.yml b/docker-compose.yml index 0a47bb3c0..af63a3b56 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: - 4000:4000 environment: - NEO4J_URI=bolt://neo4j:7687 - - GRAPHQL_LISTEN_PORT=4000 + - GRAPHQL_PORT=4000 - GRAPHQL_URI=http://localhost:4000 - CLIENT_URI=http://localhost:3000 - JWT_SECRET=b/&&7b78BF&fv/Vd diff --git a/kubernetes/backend-deployment.yaml b/kubernetes/backend-deployment.yaml index cf7f34063..95613f3ac 100644 --- a/kubernetes/backend-deployment.yaml +++ b/kubernetes/backend-deployment.yaml @@ -21,7 +21,7 @@ spec: - env: - name: CLIENT_URI value: http://localhost:3000 - - name: GRAPHQL_LISTEN_PORT + - name: GRAPHQL_PORT value: "4000" - name: GRAPHQL_URI value: http://localhost:4000 diff --git a/package.json b/package.json index 236dd805b..b6c0130f8 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "echo \"Error: no test specified\" && exit 1", "start": "./node_modules/.bin/nodemon --exec babel-node src/index.js", "start:debug": "./node_modules/.bin/nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js", - "db:seed": "concurrently --kill-others --success first 'cross-env GRAPHQL_URI=http://localhost:4001 PERMISSIONS=disabled GRAPHQL_LISTEN_PORT=4001 yarn run start' 'wait-on tcp:4001 && cross-env GRAPHQL_URI=http://localhost:4001 ./node_modules/.bin/babel-node src/seed/seed-db.js'" + "db:seed": "concurrently --kill-others --success first 'cross-env GRAPHQL_URI=http://localhost:4001 PERMISSIONS=disabled GRAPHQL_PORT=4001 yarn run start' 'wait-on tcp:4001 && cross-env GRAPHQL_URI=http://localhost:4001 ./node_modules/.bin/babel-node src/seed/seed-db.js'" }, "author": "Grzegorz Leoniec", "license": "MIT", diff --git a/src/index.js b/src/index.js index 666384a2b..dc8d30ff1 100644 --- a/src/index.js +++ b/src/index.js @@ -61,7 +61,7 @@ server.express.use(passport.initialize()) server.express.post('/graphql', passport.authenticate(['jwt'], { session: false })) const serverConfig = { - port: process.env.GRAPHQL_LISTEN_PORT + port: process.env.GRAPHQL_PORT // cors: { // credentials: true, // origin: [process.env.CLIENT_URI] // your frontend url. From 8c72c88e596746bd71923d9532e930fe474c9a01 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Wed, 21 Nov 2018 15:38:47 +0100 Subject: [PATCH 09/29] made permissions accessible for the outside --- src/middleware/permissionsMiddleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/permissionsMiddleware.js b/src/middleware/permissionsMiddleware.js index e788d08e0..3a77d1136 100644 --- a/src/middleware/permissionsMiddleware.js +++ b/src/middleware/permissionsMiddleware.js @@ -16,7 +16,7 @@ const isModerator = rule()(async (parent, args, ctx, info) => { // Permissions const permissions = shield({ Query: { - statistics: isAdmin, + statistics: allow // fruits: and(isAuthenticated, or(isAdmin, isModerator)), // customers: and(isAuthenticated, isAdmin) }, From c1387f262d19029edce081b20e25c815aab93916 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 22 Nov 2018 11:36:49 +0100 Subject: [PATCH 10/29] added permissions as first item. --- src/middleware/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/middleware/index.js b/src/middleware/index.js index 6ed0fa697..f3b036d63 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -17,8 +17,10 @@ export default schema => { fixImageUrlsMiddleware, softDeleteMiddleware ] + + // add permisions middleware if we are not seeding to the first position if (process.env.PERMISSIONS !== 'disabled') { - middleware.push(permissionsMiddleware.generate(schema)) + middleware.unshift(permissionsMiddleware.generate(schema)) } return middleware } From 3912515c2580e5b82cfbcb38d954be4b34bde0bd Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 22 Nov 2018 12:22:22 +0100 Subject: [PATCH 11/29] do not allow disabling permissions in production --- src/middleware/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/middleware/index.js b/src/middleware/index.js index f3b036d63..4d3b5f72f 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -19,7 +19,8 @@ export default schema => { ] // add permisions middleware if we are not seeding to the first position - if (process.env.PERMISSIONS !== 'disabled') { + // NOTE: DO NOT SET THE PERMISSION FLAT YOUR SELF + if (process.env.PERMISSIONS !== 'disabled' && process.env.NODE_ENV !== 'production') { middleware.unshift(permissionsMiddleware.generate(schema)) } return middleware From e5b89dc1c6e52511d5260b19ef9d66be00707baa Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 23 Nov 2018 16:08:02 +0100 Subject: [PATCH 12/29] Added travis configuration --- .travis.yml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..d9c22693f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,45 @@ +language: node_js +node_js: + - "10" +cache: + yarn: true + directories: + - node_modules +services: + # we need docker for building the image and mongo for testing + - docker +# install: + # nothing! + +jobs: + include: + - stage: Prepare Cache + script: true + - stage: Build and Test + script: + - docker build -t humanconnection/backend . + - script: + - yarn install --frozen-lockfile --non-interactive --ignore-engines + - yarn global add codacy-coverage + - yarn run ci + - cat ./coverage/lcov.info | codacy-coverage + +after_success: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh success $WEBHOOK_URL + - if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then + docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; + docker tag humanconnection/backend humanconnection/backend:latest; + docker push humanconnection/backend:alpha; + fi +# - if [ $TRAVIS_BRANCH == "develop" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then +# docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; +# docker tag humanconnection/backend humanconnection/backend:latest; +# docker push humanconnection/backend:edge; +# fi + +after_failure: + - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + - chmod +x send.sh + - ./send.sh failure $WEBHOOK_URL From 2f67cfc741ec9be26057d23170e379357319bdee Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 23 Nov 2018 16:09:59 +0100 Subject: [PATCH 13/29] fixed tag --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d9c22693f..f663eba38 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,12 +31,12 @@ after_success: - if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; docker tag humanconnection/backend humanconnection/backend:latest; - docker push humanconnection/backend:alpha; + docker push humanconnection/backend:latest; fi # - if [ $TRAVIS_BRANCH == "develop" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then # docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; # docker tag humanconnection/backend humanconnection/backend:latest; -# docker push humanconnection/backend:edge; +# docker push humanconnection/backend:latest; # fi after_failure: From 68b143be7e689e79f914c1c35c7507b6b2de654f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Fri, 23 Nov 2018 16:51:29 +0100 Subject: [PATCH 14/29] Update src/middleware/index.js Co-Authored-By: appinteractive --- src/middleware/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware/index.js b/src/middleware/index.js index 4d3b5f72f..6b17eb5f6 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -18,7 +18,7 @@ export default schema => { softDeleteMiddleware ] - // add permisions middleware if we are not seeding to the first position + // add permisions middleware at the first position (unless we're seeding) // NOTE: DO NOT SET THE PERMISSION FLAT YOUR SELF if (process.env.PERMISSIONS !== 'disabled' && process.env.NODE_ENV !== 'production') { middleware.unshift(permissionsMiddleware.generate(schema)) From d74aa6dd027be73d8782d08d4adfb781f20a0d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Fri, 23 Nov 2018 20:45:17 +0100 Subject: [PATCH 15/29] Build and run docker container on Travis The docker container environment should be the single source of truth --- .travis.yml | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index f663eba38..05142b9ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,18 +11,10 @@ services: # install: # nothing! -jobs: - include: - - stage: Prepare Cache - script: true - - stage: Build and Test - script: - - docker build -t humanconnection/backend . - - script: - - yarn install --frozen-lockfile --non-interactive --ignore-engines - - yarn global add codacy-coverage - - yarn run ci - - cat ./coverage/lcov.info | codacy-coverage +before_script: + - docker build -t humanconnection/backend . +script: + - docker run humanconnection/backend yarn run db:seed after_success: - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh @@ -33,11 +25,6 @@ after_success: docker tag humanconnection/backend humanconnection/backend:latest; docker push humanconnection/backend:latest; fi -# - if [ $TRAVIS_BRANCH == "develop" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then -# docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; -# docker tag humanconnection/backend humanconnection/backend:latest; -# docker push humanconnection/backend:latest; -# fi after_failure: - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh From 8bb90e52a6c5fa2acc3c207f8c154611d7f920e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Fri, 23 Nov 2018 20:49:09 +0100 Subject: [PATCH 16/29] Copy .env.template in Dockerfile to seed on travis --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 5e3f8c650..1b90de2b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,5 +14,6 @@ COPY yarn.lock . RUN yarn install --production=false --frozen-lockfile --non-interactive COPY . . +COPY .env.template .env CMD ["yarn", "run", "start"] From 89d30c01a01cb7ad72eb2ef3e3d7fd1c621c3124 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Sat, 24 Nov 2018 12:10:50 +0100 Subject: [PATCH 17/29] unified travis.yml and prefixed docker image --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 05142b9ea..6841b22bb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,20 +1,20 @@ language: node_js node_js: - "10" +services: + - docker cache: yarn: true directories: - node_modules -services: - # we need docker for building the image and mongo for testing - - docker # install: # nothing! before_script: - - docker build -t humanconnection/backend . + - docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/nitro-backend . + script: - - docker run humanconnection/backend yarn run db:seed + - docker run humanconnection/nitro-backend yarn run db:seed after_success: - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh @@ -22,8 +22,8 @@ after_success: - ./send.sh success $WEBHOOK_URL - if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; - docker tag humanconnection/backend humanconnection/backend:latest; - docker push humanconnection/backend:latest; + docker tag humanconnection/nitro-backend humanconnection/nitro-backend:latest; + docker push humanconnection/nitro-backend:latest; fi after_failure: From 80e036c0fbef2d81dd5c04d21c32e6c305069c51 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Sat, 24 Nov 2018 12:38:51 +0100 Subject: [PATCH 18/29] updated travis build --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6841b22bb..e451f968e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,6 @@ cache: yarn: true directories: - node_modules -# install: - # nothing! before_script: - docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/nitro-backend . @@ -17,9 +15,9 @@ script: - docker run humanconnection/nitro-backend yarn run db:seed after_success: - - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh - - chmod +x send.sh - - ./send.sh success $WEBHOOK_URL + # - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh + # - chmod +x send.sh + # - ./send.sh success $WEBHOOK_URL - if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; docker tag humanconnection/nitro-backend humanconnection/nitro-backend:latest; From b25a7d673e088fe66776dc62832cdb14597eea3c Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Sat, 24 Nov 2018 12:41:17 +0100 Subject: [PATCH 19/29] user humanconnection/nitro-backend --- kubernetes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes/README.md b/kubernetes/README.md index 7699e5426..81c6c4f88 100644 --- a/kubernetes/README.md +++ b/kubernetes/README.md @@ -27,7 +27,7 @@ git clone https://github.com/Human-Connection/Nitro-Web.git Build Docker images, using the Minikube Docker daemon: ```sh eval $(minikube docker-env) -docker build -t humanconnection/backend:latest Nitro-Backend/ +docker build -t humanconnection/nitro-backend:latest Nitro-Backend/ docker build -t humanconnection/neo4j:latest -f Nitro-Backend/Dockerfile.neo4j Nitro-Backend/ ``` From e2f7bc516c071d768b5ec601de07890334ee099f Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Sat, 24 Nov 2018 12:58:13 +0100 Subject: [PATCH 20/29] improved docker file --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1b90de2b1..45d68e8b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,14 @@ FROM node:10-alpine -LABEL Description="Server part of the social network Human Connection" Vendor="Human-Connection gGmbH" Version="0.0.1" Maintainer="Human-Connection gGmbH (developer@human-connection.org)" +LABEL Description="Backend of the Social Network Human-Connection.org" Vendor="Human-Connection gGmbH" Version="0.0.1" Maintainer="Human-Connection gGmbH (developer@human-connection.org)" -# expose the app port +# Expose the app port EXPOSE 4000 -ARG WORKDIR=/backend - +ARG WORKDIR=/nitro-backend RUN mkdir -p $WORKDIR WORKDIR $WORKDIR +# Install the Application Dependencies COPY package.json . COPY yarn.lock . RUN yarn install --production=false --frozen-lockfile --non-interactive From e218773dd5eccbd278f1b931864144af22f2eec8 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Sun, 25 Nov 2018 14:23:52 +0100 Subject: [PATCH 21/29] fixed build by using install instead before_script --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e451f968e..62f05c96a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ cache: directories: - node_modules -before_script: +install: - docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/nitro-backend . script: From 5597e34dab8198d0cf4b4476b28b142f40e25f7b Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Mon, 26 Nov 2018 17:18:09 +0100 Subject: [PATCH 22/29] Fixed Badges Seeder and URL Fix Middleware --- src/middleware/fixImageUrlsMiddleware.js | 9 +++++++-- src/seed/data/badges.js | 12 ++++++------ src/seed/data/users-badges.js | 7 ++++++- src/seed/data/users-blacklist.js | 7 +------ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/middleware/fixImageUrlsMiddleware.js b/src/middleware/fixImageUrlsMiddleware.js index 864726a54..919a46ab6 100644 --- a/src/middleware/fixImageUrlsMiddleware.js +++ b/src/middleware/fixImageUrlsMiddleware.js @@ -1,9 +1,14 @@ +const urlSearchAlpha = 'https://api-alpha.human-connection.org' +const urlSearchLocal = 'http://localhost:3000' + export const fixUrl = (url) => { - return url.replace('https://api-alpha.human-connection.org', 'http://localhost:3000') + url = url.replace(urlSearchAlpha, '') + url = url.replace(urlSearchLocal, '') + return url } const fixImageURLs = (result, recursive) => { - if (result && typeof result === 'string' && result.indexOf('https://api-alpha.human-connection.org') === 0) { + if (result && typeof result === 'string' && (result.indexOf(urlSearchAlpha) === 0 || result.indexOf(urlSearchLocal) === 0)) { result = fixUrl(result) } else if (result && Array.isArray(result)) { result.forEach((res, index) => { diff --git a/src/seed/data/badges.js b/src/seed/data/badges.js index d4144d30e..bb3ad06c7 100644 --- a/src/seed/data/badges.js +++ b/src/seed/data/badges.js @@ -1,12 +1,12 @@ export default function (data) { return ` mutation { - b1: CreateBadge(id: "b1", key: "indiegogo_en_racoon", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_racoon.svg") { id } - b2: CreateBadge(id: "b2", key: "indiegogo_en_rabbit", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rabbit.svg") { id } - b3: CreateBadge(id: "b3", key: "indiegogo_en_wolf", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_wolf.svg") { id } - b4: CreateBadge(id: "b4", key: "indiegogo_en_bear", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_bear.svg") { id } - b5: CreateBadge(id: "b5", key: "indiegogo_en_turtle", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_turtle.svg") { id } - b6: CreateBadge(id: "b6", key: "indiegogo_en_rhino", type: crowdfunding, status: permanent, icon: "http://localhost:3000/img/badges/indiegogo_en_rhino.svg") { id } + b1: CreateBadge(id: "b1", key: "indiegogo_en_racoon", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_racoon.svg") { id } + b2: CreateBadge(id: "b2", key: "indiegogo_en_rabbit", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_rabbit.svg") { id } + b3: CreateBadge(id: "b3", key: "indiegogo_en_wolf", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_wolf.svg") { id } + b4: CreateBadge(id: "b4", key: "indiegogo_en_bear", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_bear.svg") { id } + b5: CreateBadge(id: "b5", key: "indiegogo_en_turtle", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_turtle.svg") { id } + b6: CreateBadge(id: "b6", key: "indiegogo_en_rhino", type: crowdfunding, status: permanent, icon: "/img/badges/indiegogo_en_rhino.svg") { id } } ` } diff --git a/src/seed/data/users-badges.js b/src/seed/data/users-badges.js index e303c6157..1a8bc1fe1 100644 --- a/src/seed/data/users-badges.js +++ b/src/seed/data/users-badges.js @@ -1,7 +1,12 @@ export default function (data) { return ` mutation { - u1_blacklist_u4: AddUserBlacklisted(from: { id: "u1" }, to: { id: "u4" }) { from { id } } + b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } + b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } + b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } + b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } + b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } + b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } } ` } diff --git a/src/seed/data/users-blacklist.js b/src/seed/data/users-blacklist.js index 1a8bc1fe1..e303c6157 100644 --- a/src/seed/data/users-blacklist.js +++ b/src/seed/data/users-blacklist.js @@ -1,12 +1,7 @@ export default function (data) { return ` mutation { - b1_u1: AddUserBadges(from: {id: "b1"}, to: {id: "u1"}) { from { id } } - b2_u1: AddUserBadges(from: {id: "b2"}, to: {id: "u1"}) { from { id } } - b3_u1: AddUserBadges(from: {id: "b3"}, to: {id: "u1"}) { from { id } } - b6_u2: AddUserBadges(from: {id: "b6"}, to: {id: "u2"}) { from { id } } - b3_u3: AddUserBadges(from: {id: "b3"}, to: {id: "u3"}) { from { id } } - b5_u4: AddUserBadges(from: {id: "b5"}, to: {id: "u4"}) { from { id } } + u1_blacklist_u4: AddUserBlacklisted(from: { id: "u1" }, to: { id: "u4" }) { from { id } } } ` } From ebcec50a09e69ed8b89944f261e8d2ea0d631488 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Mon, 26 Nov 2018 18:03:59 +0100 Subject: [PATCH 23/29] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2cb57e264..653068a1d 100644 --- a/README.md +++ b/README.md @@ -105,9 +105,9 @@ Optionally you can seed the GraphQL service by executing mutations that will write sample data to the database: ```bash -yarn seedDb +yarn db:seed # -or- -npm run seedDb +npm run db:seed ``` ## Todo`s From 28ed218d9933c4f6e229157e8cc9fa88e66e3ed1 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Tue, 27 Nov 2018 11:27:19 +0100 Subject: [PATCH 24/29] updated nodemon due to possible security issue: https://github.com/dominictarr/event-stream/issues/116 --- package.json | 2 +- yarn.lock | 85 +++++++--------------------------------------------- 2 files changed, 11 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index f2f667236..268f2e1a7 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "concurrently": "^4.1.0", "cross-env": "^5.2.0", "faker": "^4.1.0", - "nodemon": "^1.18.4", + "nodemon": "^1.18.7", "wait-on": "^3.2.0" } } diff --git a/yarn.lock b/yarn.lock index 0adbbdbab..1d79d8da6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2026,11 +2026,6 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1, duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2125,20 +2120,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-stream@~3.3.0: - version "3.3.6" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" - integrity sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g== - dependencies: - duplexer "^0.1.1" - flatmap-stream "^0.1.0" - from "^0.1.7" - map-stream "0.0.7" - pause-stream "^0.0.11" - split "^1.0.1" - stream-combiner "^0.2.2" - through "^2.3.8" - eventemitter3@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -2345,11 +2326,6 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flatmap-stream@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.2.tgz#b1da359a93f24f6d96e46f948552d997e3c2863d" - integrity sha512-ucyr6WkLXjyMuHPtOUq4l+nSAxgWi7v4QO508eQ9resnGj+lSup26oIsUI5aH8k4Qfpjsxa8dDf9UCKkS2KHzQ== - for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2386,11 +2362,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3535,11 +3506,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" - integrity sha1-ih8HiW2CsQkmvTdEokIACfiJdKg= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -3784,16 +3750,16 @@ node-releases@^1.0.1: dependencies: semver "^5.3.0" -nodemon@^1.18.4: - version "1.18.6" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.6.tgz#89b1136634d6c0afc7de24cc932a760e999e2c76" - integrity sha512-4pHQNYEZun+IkIC2jCaXEhkZnfA7rQe73i8RkdRyDJls/K+WxR7IpI5uNUsAvQ0zWvYcCDNGD+XVtw2ZG86/uQ== +nodemon@^1.18.7: + version "1.18.7" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.7.tgz#716b66bf3e89ac4fcfb38a9e61887a03fc82efbb" + integrity sha512-xuC1V0F5EcEyKQ1VhHYD13owznQbUw29JKvZ8bVH7TmuvVNHvvbp9pLgE4PjTMRJVe0pJ8fGRvwR2nMiosIsPQ== dependencies: chokidar "^2.0.4" debug "^3.1.0" ignore-by-default "^1.0.1" minimatch "^3.0.4" - pstree.remy "^1.1.0" + pstree.remy "^1.1.2" semver "^5.5.0" supports-color "^5.2.0" touch "^3.1.0" @@ -4168,13 +4134,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -pause-stream@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" @@ -4280,13 +4239,6 @@ proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.8.0" -ps-tree@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" - integrity sha1-tCGyQUDWID8e08dplrRCewjowBQ= - dependencies: - event-stream "~3.3.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4297,12 +4249,10 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== -pstree.remy@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" - integrity sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q== - dependencies: - ps-tree "^1.1.0" +pstree.remy@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz#4448bbeb4b2af1fed242afc8dc7416a6f504951a" + integrity sha512-vL6NLxNHzkNTjGJUpMm5PLC+94/0tTlC1vkP9bdU0pOHih+EujMjgMTwfZopZvHWRFbqJ5Y73OMoau50PewDDA== punycode@1.3.2: version "1.3.2" @@ -4870,13 +4820,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4923,14 +4866,6 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -stream-combiner@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" - integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg= - dependencies: - duplexer "~0.1.1" - through "~2.3.4" - streamsearch@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" @@ -5049,7 +4984,7 @@ text-encoding@^0.6.4: resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= -through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= From 834aae1ed293c108be5c267534561afcf09a5faf Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 29 Nov 2018 19:45:35 +0100 Subject: [PATCH 25/29] removed seeding on build for now --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 62f05c96a..1f4076178 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ install: - docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/nitro-backend . script: - - docker run humanconnection/nitro-backend yarn run db:seed + # - docker run humanconnection/nitro-backend yarn run db:seed after_success: # - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh From 86662eb56c18a28379c81ed730243b480f65ea64 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 30 Nov 2018 09:13:13 +0100 Subject: [PATCH 26/29] do not abort on test command --- .travis.yml | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1f4076178..e9a1878ce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ install: - docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/nitro-backend . script: + # TODO: re-add when testing is setup properly # - docker run humanconnection/nitro-backend yarn run db:seed after_success: diff --git a/package.json b/package.json index 268f2e1a7..8d5705641 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "GraphQL Backend for Human Connection", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "echo \"Error: no test specified\" && exit 0", "start": "./node_modules/.bin/nodemon --exec babel-node src/index.js", "start:debug": "./node_modules/.bin/nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js", "db:seed": "concurrently --kill-others --success first 'cross-env GRAPHQL_URI=http://localhost:4001 PERMISSIONS=disabled GRAPHQL_PORT=4001 yarn run start' 'wait-on tcp:4001 && cross-env GRAPHQL_URI=http://localhost:4001 ./node_modules/.bin/babel-node src/seed/seed-db.js'" From 2fb239de7cd746a3dfb7df855bd406b0a336e530 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 30 Nov 2018 09:34:31 +0100 Subject: [PATCH 27/29] fixed docker-compose to use humanconnection/nitro-backend:latest --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index af63a3b56..71ea7355c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: backend: - image: humanconnection/backend:latest + image: humanconnection/nitro-backend:latest build: . networks: - hc-network From 27a9410089ecb4b8f2878188bdd0f7f4837efd5c Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 30 Nov 2018 09:36:03 +0100 Subject: [PATCH 28/29] use humanconnection/nitro-backend --- kubernetes/backend-deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes/backend-deployment.yaml b/kubernetes/backend-deployment.yaml index 95613f3ac..f75920f0d 100644 --- a/kubernetes/backend-deployment.yaml +++ b/kubernetes/backend-deployment.yaml @@ -31,7 +31,7 @@ spec: value: "false" - name: NEO4J_URI value: bolt://neo4j:7687 - image: humanconnection/backend:latest + image: humanconnection/nitro-backend:latest name: backend ports: - containerPort: 4000 From 38c6323d1f33fcd5a22e141dd5937fa4a6a89b2d Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 30 Nov 2018 09:38:20 +0100 Subject: [PATCH 29/29] fixed vendor name --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 45d68e8b6..269b74ea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM node:10-alpine -LABEL Description="Backend of the Social Network Human-Connection.org" Vendor="Human-Connection gGmbH" Version="0.0.1" Maintainer="Human-Connection gGmbH (developer@human-connection.org)" +LABEL Description="Backend of the Social Network Human-Connection.org" Vendor="Human Connection gGmbH" Version="0.0.1" Maintainer="Human Connection gGmbH (developer@human-connection.org)" # Expose the app port EXPOSE 4000