From 8b0be5fb89037e583862f61c42da54b96b5bc132 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 15 Nov 2018 12:33:05 +0100 Subject: [PATCH 01/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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 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 12/12] 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))