From cc06d53a57f06a8759108164e2b3b2c040478c2b Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 27 Dec 2018 16:06:40 +0100 Subject: [PATCH 001/130] Inital minimal working version with graqhql, metascraper and oembed --- .babelrc | 12 + .eslintrc.js | 18 + .gitignore | 61 + .graphqlconfig | 3 + LICENSE | 21 + package.json | 53 + src/graphql-schema.js | 8 + src/index.js | 17 + src/schema.graphql | 19 + src/scraper.js | 128 ++ yarn.lock | 3799 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 4139 insertions(+) create mode 100644 .babelrc create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .graphqlconfig create mode 100755 LICENSE create mode 100644 package.json create mode 100644 src/graphql-schema.js create mode 100644 src/index.js create mode 100644 src/schema.graphql create mode 100644 src/scraper.js create mode 100644 yarn.lock diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..2d91b3635 --- /dev/null +++ b/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "node": "10" + } + } + ] + ] +} diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..ae2dcb316 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + "extends": "standard", + "parser": "babel-eslint", + "env": { + "es6": true, + "node": true, + }, + "rules": { + "indent": [ + "error", + 2 + ], + "quotes": [ + "error", + "single" + ] + } +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ad46b3088 --- /dev/null +++ b/.gitignore @@ -0,0 +1,61 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next diff --git a/.graphqlconfig b/.graphqlconfig new file mode 100644 index 000000000..ca328bc83 --- /dev/null +++ b/.graphqlconfig @@ -0,0 +1,3 @@ +{ + "schemaPath": "./src/schema.graphql" +} diff --git a/LICENSE b/LICENSE new file mode 100755 index 000000000..45cc9972b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Human-Connection + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package.json b/package.json new file mode 100644 index 000000000..4e59f09dd --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "nitro-embed", + "version": "0.0.1", + "description": "API Service for fetching URL Information like images, icons, descriptions etc. thourgh OpenGraph, oEmbed and other standards.", + "main": "src/index.js", + "scripts": { + "dev": "nodemon src/", + "start": "node src/", + "test": "test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Human-Connection/Nitro-Embed.git" + }, + "keywords": [ + "pengraph", + "oembed" + ], + "author": "Grzegorz Leoniec (http://app-interactive.de)", + "license": "MIT", + "bugs": { + "url": "https://github.com/Human-Connection/Nitro-Embed/issues" + }, + "homepage": "https://github.com/Human-Connection/Nitro-Embed#readme", + "dependencies": { + "@metascraper/helpers": "^4.8.5", + "apollo-server": "^2.3.1", + "got": "^9.5.0", + "graphql": "^14.0.2", + "lodash": "^4.17.11", + "metascraper": "^4.8.5", + "metascraper-audio": "^4.8.5", + "metascraper-author": "^4.8.5", + "metascraper-clearbit-logo": "^4.8.5", + "metascraper-date": "^4.8.5", + "metascraper-description": "^4.8.5", + "metascraper-image": "^4.8.5", + "metascraper-lang": "^4.8.5", + "metascraper-lang-detector": "^4.8.5", + "metascraper-logo": "^4.8.5", + "metascraper-logo-favicon": "^4.8.5", + "metascraper-publisher": "^4.8.5", + "metascraper-title": "^4.8.5", + "metascraper-url": "^4.8.5", + "metascraper-video": "^4.8.5", + "metascraper-youtube": "^4.8.5", + "request": "^2.88.0", + "request-promise-native": "^1.0.5" + }, + "devDependencies": { + "nodemon": "^1.18.9" + } +} diff --git a/src/graphql-schema.js b/src/graphql-schema.js new file mode 100644 index 000000000..332ec18bc --- /dev/null +++ b/src/graphql-schema.js @@ -0,0 +1,8 @@ +const fs = require('fs') +const path = require('path') + +const { gql } = require('apollo-server') + +module.exports = gql(fs + .readFileSync(path.join(__dirname, 'schema.graphql')) + .toString('utf-8')) diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..7015e0a53 --- /dev/null +++ b/src/index.js @@ -0,0 +1,17 @@ +const { ApolloServer, gql } = require('apollo-server') +const scraper = require('./scraper.js') +const typeDefs = require('./graphql-schema.js') + +const resolvers = { + Query: { + async embed(obj, {url}, ctx, info) { + return await scraper.fetch(url) + } + } +} + +const server = new ApolloServer({ typeDefs, resolvers }) + +server.listen({ port: 3050 }).then(({ url }) => { + console.log(`🚀 Nitro Embed - Server is ready at ${url}`) +}) diff --git a/src/schema.graphql b/src/schema.graphql new file mode 100644 index 000000000..229745bb6 --- /dev/null +++ b/src/schema.graphql @@ -0,0 +1,19 @@ +type Embed { + type: String + title: String + author: String + publisher: String + date: String + description: String + url: String + image: String + audio: String + video: String + lang: String + logo: String + embed: String +} + +type Query { + embed(url: String!): Embed +} diff --git a/src/scraper.js b/src/scraper.js new file mode 100644 index 000000000..8c44dc0dd --- /dev/null +++ b/src/scraper.js @@ -0,0 +1,128 @@ +const metascraper = require('metascraper')([ + require('metascraper-author')(), + require('metascraper-date')(), + require('metascraper-description')(), + require('metascraper-image')(), + require('metascraper-lang')(), + require('metascraper-lang-detector')(), + require('metascraper-logo')(), + require('metascraper-logo-favicon')(), + // require('metascraper-clearbit-logo')(), + require('metascraper-publisher')(), + require('metascraper-title')(), + require('metascraper-url')(), + require('metascraper-video')(), + require('metascraper-youtube')() + + // require('./rules/metascraper-embed')() +]) +const got = require('got') +const request = require('request-promise-native') +const find = require('lodash/find') +const isEmpty = require('lodash/isEmpty') +const each = require('lodash/each') +const urlParser = require('url') + +// quick in memory cache +let cache = {} + +let oEmbedProviders = [] +const getEmbedProviders = async () => { + let providers = await request('https://oembed.com/providers.json') + providers = JSON.parse(providers) + oEmbedProviders = providers + return providers +} +getEmbedProviders() + +const removeEmptyAttrs = obj => { + let output = {} + each(obj, (o, k) => { + if (!isEmpty(o)) { + output[k] = o + } + }) + return output +} + +const scraper = { + async fetch(targetUrl) { + + if (targetUrl.indexOf('//youtu.be/')) { + // replace youtu.be to get proper results + targetUrl = targetUrl.replace('//youtu.be/', '//youtube.com/') + } + + let meta = {} + let embed = {} + + // only get data from requested services + await Promise.all([ + new Promise(async (resolve, reject) => { + try { + meta = await scraper.fetchMeta(targetUrl) + resolve() + } catch(err) { + resolve() + } + }), + new Promise(async (resolve, reject) => { + try { + embed = await scraper.fetchEmbed(targetUrl) + resolve() + } catch(err) { + resolve() + } + }) + ]) + return { + ...(removeEmptyAttrs(meta)), + ...(removeEmptyAttrs(embed)) + } + }, + async fetchEmbed(targetUrl) { + const url = urlParser.parse(targetUrl) + const embedMeta = find(oEmbedProviders, provider => { + return provider.provider_url.indexOf(url.hostname) >= 0 + }) + if (!embedMeta) { + return {} + } + const embedUrl = embedMeta.endpoints[0].url.replace('{format}', 'json') + + let data = await request(`${embedUrl}?url=${targetUrl}`) + if (data) { + data = JSON.parse(data) + + let output = { + type: data.type, + embed: data.html, + author: data.author_name, + date: data.upload_date ? new Date(data.upload_date).toISOString() : null + } + + return output + } + return {} + }, + async fetchMeta(targetUrl) { + + // const parsedURL = urlParser.parse(targetUrl) + // console.log(parsedURL) + + // get from cache + if (cache[targetUrl]) { + return cache[targetUrl] + } + + const { body: html, url } = await got(targetUrl) + const metadata = await metascraper({ html, url }) + + // write to cache + cache[targetUrl] = metadata + + return metadata + } +} + +module.exports = scraper diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..dd072e74a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3799 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollographql/apollo-tools@^0.2.6": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.2.9.tgz#1e20999d11728ef47f8f812f2be0426b5dde1a51" + integrity sha512-AEIQwPkS0QLbkpb6WyRhV4aOMxuErasp47ABv5niDKOasQH8mrD8JSGKJAHuQxVe4kB8DE9sLRoc5qeQ0KFCHA== + dependencies: + apollo-env "0.2.5" + +"@apollographql/graphql-playground-html@^1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz#022209e28a2b547dcde15b219f0c50f47aa5beb3" + integrity sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ== + +"@metascraper/helpers@^4.8.5": + version "4.8.5" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-4.8.5.tgz#1291fc121b543d4d7c1510a22d3b6d6780e74c64" + integrity sha512-nRkmAiYNvRUIYuXY0WrS3aRw+E+qBUTYfbP7xNjlIeAD/udWOLWr+nj0GdXe2hLUBebDK9luxpvYQ6wBQu+OZQ== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.5" + condense-whitespace "~1.0.0" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~2.0.0" + iso-639-3 "~1.1.0" + isostring "0.0.1" + lodash "~4.17.11" + mime-types "~2.1.21" + normalize-url "~4.1.0" + smartquotes "~2.3.1" + title "~3.4.0" + truncate "~2.0.1" + url-regex "~4.1.1" + video-extensions "~1.1.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.1.tgz#6402258dfe467532b26649ef076b4d11f74fb612" + integrity sha512-WljfOGkmSJe8SUkl+4TPvN2ec0dpUGVyfTBQLoXJUiILs+wBSc4Kvp2N3aAWE4VwwDSLGdmD3/bufS5BgZpVSQ== + dependencies: + defer-to-connect "^1.0.1" + +"@types/accepts@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/body-parser@*", "@types/body-parser@1.17.0": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.4.tgz#50991a759a29c0b89492751008c6af7a7c8267b0" + integrity sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw== + dependencies: + "@types/express" "*" + +"@types/events@*": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== + +"@types/express-serve-static-core@*": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" + integrity sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w== + dependencies: + "@types/events" "*" + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@4.16.0": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" + integrity sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + +"@types/long@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" + integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== + +"@types/mime@*": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" + integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA== + +"@types/node@*", "@types/node@^10.1.0": + version "10.12.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" + integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/ws@^6.0.0": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28" + integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q== + dependencies: + "@types/events" "*" + "@types/node" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@^1.3.5, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +aggregate-error@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-1.0.0.tgz#888344dad0220a72e3af50906117f48771925fac" + integrity sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w= + dependencies: + clean-stack "^1.0.0" + indent-string "^3.0.0" + +ajv@^6.5.5: + version "6.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" + integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== + 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" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^3.1.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +apollo-cache-control@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.4.0.tgz#fec343e6ec95aa4f1b88e07e62f067bee0c48397" + integrity sha512-WuriaNQIugTE8gYwfBWWCbbQTSKul/cV4JMi5UgqNIUvjHvnKZQLKbt5uYWow6QQNMkLT9hey8QPYkWpogkeSA== + dependencies: + apollo-server-env "2.2.0" + graphql-extensions "0.4.0" + +apollo-datasource@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.2.1.tgz#3ecef4efe64f7a04a43862f32027d38ac09e142c" + integrity sha512-r185+JTa5KuF1INeTAk7AEP76zwMN6c8Ph1lmpzJMNwBUEzTGnLClrccCskCBx4SxfnkdKbuQdwn9JwCJUWrdg== + dependencies: + apollo-server-caching "0.2.1" + apollo-server-env "2.2.0" + +apollo-engine-reporting-protobuf@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.2.0.tgz#2aaf4d2eddefe7924d469cf1135267bc0deadf73" + integrity sha512-qI+GJKN78UMJ9Aq/ORdiM2qymZ5yswem+/VDdVFocq+/e1QqxjnpKjQWISkswci5+WtpJl9SpHBNxG98uHDKkA== + dependencies: + protobufjs "^6.8.6" + +apollo-engine-reporting@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-0.2.0.tgz#e71816b1f46e782f8538c5a118148d4c0e628e25" + integrity sha512-Q6FfVb10v/nrv8FaFsPjIYlWh62jaYav3LuMgM9PsHWGK/zRQFXOEwLxcY2UCvG7O1moxF3XGmfBhMgo54py+Q== + dependencies: + apollo-engine-reporting-protobuf "0.2.0" + apollo-server-env "2.2.0" + async-retry "^1.2.1" + graphql-extensions "0.4.0" + lodash "^4.17.10" + +apollo-env@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.2.5.tgz#162c785bccd2aea69350a7600fab4b7147fc9da5" + integrity sha512-Gc7TEbwCl7jJVutnn8TWfzNSkrrqyoo0DP92BQJFU9pZbJhpidoXf2Sw1YwOJl82rRKH3ujM3C8vdZLOgpFcFA== + dependencies: + core-js "^3.0.0-beta.3" + node-fetch "^2.2.0" + +apollo-link@^1.2.3: + version "1.2.6" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.6.tgz#d9b5676d79c01eb4e424b95c7171697f6ad2b8da" + integrity sha512-sUNlA20nqIF3gG3F8eyMD+mO80fmf3dPZX+GUOs3MI9oZR8ug09H3F0UsWJMcpEg6h55Yy5wZ+BMmAjrbenF/Q== + dependencies: + apollo-utilities "^1.0.0" + zen-observable-ts "^0.8.13" + +apollo-server-caching@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.2.1.tgz#7e67f8c8cac829e622b394f0fb82579cabbeadfd" + integrity sha512-+U9F3X297LL8Gqy6ypfDNEv/DfV/tDht9Dr2z3AMaEkNW1bwO6rmdDL01zYxDuVDVq6Z3qSiNCSO2pXE2F0zmA== + dependencies: + lru-cache "^5.0.0" + +apollo-server-core@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.3.1.tgz#cbdc0020a0dfecf2220cf5062dbb304fdf56edf2" + integrity sha512-8jMWYOQIZi9mDJlHe2rXg8Cp4xKYogeRu23jkcNy+k5UjZL+eO+kHXbNFiTaP4HLYYEpe2XE3asxp6q5YUEQeQ== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + "@apollographql/graphql-playground-html" "^1.6.6" + "@types/ws" "^6.0.0" + apollo-cache-control "0.4.0" + apollo-datasource "0.2.1" + apollo-engine-reporting "0.2.0" + apollo-server-caching "0.2.1" + apollo-server-env "2.2.0" + apollo-server-errors "2.2.0" + apollo-server-plugin-base "0.2.1" + apollo-tracing "0.4.0" + graphql-extensions "0.4.1" + graphql-subscriptions "^1.0.0" + graphql-tag "^2.9.2" + graphql-tools "^4.0.0" + graphql-upload "^8.0.2" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + subscriptions-transport-ws "^0.9.11" + ws "^6.0.0" + +apollo-server-env@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.2.0.tgz#5eec5dbf46581f663fd6692b2e05c7e8ae6d6034" + integrity sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA== + dependencies: + node-fetch "^2.1.2" + util.promisify "^1.0.0" + +apollo-server-errors@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.2.0.tgz#5b452a1d6ff76440eb0f127511dc58031a8f3cb5" + integrity sha512-gV9EZG2tovFtT1cLuCTavnJu2DaKxnXPRNGSTo+SDI6IAk6cdzyW0Gje5N2+3LybI0Wq5KAbW6VLei31S4MWmg== + +apollo-server-express@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.3.1.tgz#0598e2fa0a0d9e6eb570c0bb6ce65c31810a9c09" + integrity sha512-J+rObr4GdT/5j6qTByUJoSvZSjTAX/7VqIkr2t+GxwcVUFGet2MdOHuV6rtWKc8CRgvVKfKN6iBrb2EOFcp2LQ== + dependencies: + "@apollographql/graphql-playground-html" "^1.6.6" + "@types/accepts" "^1.3.5" + "@types/body-parser" "1.17.0" + "@types/cors" "^2.8.4" + "@types/express" "4.16.0" + accepts "^1.3.5" + apollo-server-core "2.3.1" + body-parser "^1.18.3" + cors "^2.8.4" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + type-is "^1.6.16" + +apollo-server-plugin-base@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.2.1.tgz#d08c9576f7f11ab6e212f352d482faaa4059a31e" + integrity sha512-497NIY9VWRYCrMSkgR11IrIUO4Fsy6aGgnpOJoTdLQAnkDD9SJDSRzwKj4gypUoTT2unfKDng4eMxXVZlHvjOw== + +apollo-server@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.3.1.tgz#4d2b6bbb48b44d86076680304705b8b7ae952d37" + integrity sha512-+S+/BhLJF9Ms99OK9HpC4P6rcVWTobWWKeLSVdgxqG487i/kwMrCAw/ICrDVJGeOGJRi6PndVu9XdHWHuX1lvQ== + dependencies: + apollo-server-core "2.3.1" + apollo-server-express "2.3.1" + express "^4.0.0" + graphql-subscriptions "^1.0.0" + graphql-tools "^4.0.0" + +apollo-tracing@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.4.0.tgz#4b939063f4292422ac5a3564b76d1d88dec0a916" + integrity sha512-BlM8iQUQva4fm0xD/pLwkcz0degfB9a/aAn4k4cK36eLVD8XUkl7ptEB0c+cwcj7tOYpV1r5QX1XwdayBzlHSg== + dependencies: + apollo-server-env "2.2.0" + graphql-extensions "0.4.0" + +apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: + version "1.0.27" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.27.tgz#77c550f9086552376eca3a48e234a1466b5b057e" + integrity sha512-nzrMQ89JMpNmYnVGJ4t8zN75gQbql27UDhlxNi+3OModp0Masx5g+fQmQJ5B4w2dpRuYOsdwFLmj3lQbwOKV1Q== + dependencies: + fast-json-stable-stringify "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arch@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" + integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" + integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +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" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async-retry@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0" + integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q== + 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" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +audio-extensions@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/audio-extensions/-/audio-extensions-0.0.0.tgz#d0eefe077fb9eb625898eed9985890548cf1f8d2" + integrity sha1-0O7+B3+562JYmO7ZmFiQVIzx+NI= + +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== + +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.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" + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + +body-parser@1.18.3, body-parser@^1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +busboy@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-request@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-5.2.1.tgz#41814b0460b68b9baf74f57f5a6046224d55d71e" + integrity sha512-+dLut9zvvuIM/MrtdHBVSh/QYJ9+uCKYoqww9cOYrndQH4O4rD/qH0IAwFhD5WJKfmWE6WgCOrLQPd/H5YJRVQ== + dependencies: + clone-response "^1.0.2" + get-stream "^4.0.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^1.0.1" + normalize-url "^3.1.0" + responselike "^1.0.2" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +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" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +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@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@^2.0.1, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +cheerio-advanced-selectors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cheerio-advanced-selectors/-/cheerio-advanced-selectors-2.0.1.tgz#fb5ec70a4599e8cec1cf669c6d9b90a3fa969c48" + integrity sha512-5wHR8bpiD5pdUtaS81A6hnJezzoDzL1TLWfK6bxnLkIgEKPV26BlOdMCcvuj3fTE7JSalsTUeNU7AOD/u6bYhw== + +cheerio@~1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" + integrity sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash "^4.15.0" + parse5 "^3.0.1" + +chokidar@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chrono-node@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.5.tgz#a2495298a32da82bcc01ad9be7d77efa5e244122" + integrity sha1-oklSmKMtqCvMAa2b59d++l4kQSI= + dependencies: + moment "^2.10.3" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-stack@^1.0.0, clean-stack@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +clipboardy@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" + integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== + dependencies: + arch "^2.1.0" + execa "^0.8.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.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" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collapse-white-space@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091" + integrity sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +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" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +condense-whitespace@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" + integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^3.0.0-beta.3: + version "3.0.0-beta.6" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0-beta.6.tgz#f1ee6c8bd9c1941f992fda01f886b3b40ceb1510" + integrity sha512-06k0SnRTdYGlTNek5vAqfxbQjTtMM0zC2xJ79T1QM5UkZS0JQegrOgDiGh43n1QICnOe5+bcvS0zOGTm2C7rBA== + +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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cors@^2.8.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + 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" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" + integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== + +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" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +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" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defer-to-connect@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.1.tgz#41ec1dd670dc4c6dcbe7e54c9e44d784d025fe63" + integrity sha512-2e0FJesseUqQj671gvZWfUyxpnFx/5n4xleamlpCD3U6Fm5dh5qzmmLNxNhtmHF06+SYVHH8QU6FACffYTnj0Q== + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + 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" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +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" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +es-abstract@^1.5.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + 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.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= + dependencies: + cross-spawn "^5.0.1" + 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" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +express@^4.0.0: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + 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== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + 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= + +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" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +file-extension@~4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/file-extension/-/file-extension-4.0.5.tgz#ae6cef34c28e7313a92baa4aa955755cacdf0ce3" + integrity sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +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" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +franc@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/franc/-/franc-4.0.0.tgz#365951bc787b92ffbb1c63c1c492d6b76cbd3a56" + integrity sha512-4991aLWY5sLg2fsyiOPflUjye5XBKyUO4V9O4FTBbQ7xKugvnmP9x3m3LlrpD7kq1BebMThNkEXnK52HaU3ZkQ== + dependencies: + trigram-utils "^1.0.0" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-capacitor@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-1.0.1.tgz#ff9dbfa14dfaf4472537720f19c3088ed9278df0" + integrity sha512-XdZK0Q78WP29Vm3FGgJRhRhrBm51PagovzWtW2kJ3Q6cYJbGtZqWSGTSPwvtEkyjIirFd7b8Yes/dpOYjt4RRQ== + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-src@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-src/-/get-src-1.0.1.tgz#ca11dbe4a93c7f3aa85cec95fcb0b2dfaa9539ee" + integrity sha1-yhHb5Kk8fzqoXOyV/LCy36qVOe4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +get-video-id@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/get-video-id/-/get-video-id-3.1.0.tgz#44f025a99f824f8f54789dd5d0bf55d122531940" + integrity sha512-dWjLwCBtvGB8aP5S91Vs5W01dTaEykY43whz+wSS9G0zkuTmh7FZ1rZ4A5M33vf/8vvHPlMhLreUSdEJ4yW7Dw== + dependencies: + get-src "^1.0.1" + +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-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.5: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@^9.3.2, got@^9.5.0, got@~9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.5.0.tgz#6fd0312c6b694c0a11d9119d95fd7daed174eb49" + integrity sha512-N+4kb6i9t1lauJ4NwLVVoFVLxZNa6i+iivtNzCSVw7+bVbTXoq0qXctdd8i9rj3lrI0zDk5NGzcO4bfpEP6Uuw== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.0" + cacheable-request "^5.1.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +graphql-extensions@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.0.tgz#5857c7b7b9f20dbccbfd88730fffa5963b3c61ee" + integrity sha512-8TUgIIUVpXWOcqq9RdmTSHUrhc3a/s+saKv9cCl8TYWHK9vyJIdea7ZaSKHGDthZNcsN+C3LulZYRL3Ah8ukoA== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + +graphql-extensions@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.1.tgz#92c49a8409ffbfb24559d7661ab60cc90d6086e4" + integrity sha512-Xei4rBxbsTHU6dYiq9y1xxbpRMU3+Os7yD3vXV5W4HbTaxRMizDmu6LAvV4oBEi0ttwICHARQjYTjDTDhHnxrQ== + dependencies: + "@apollographql/apollo-tools" "^0.2.6" + +graphql-subscriptions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz#475267694b3bd465af6477dbab4263a3f62702b8" + integrity sha512-+ytmryoHF1LVf58NKEaNPRUzYyXplm120ntxfPcgOBC7TnK7Tv/4VRHeh4FAR9iL+O1bqhZs4nkibxQ+OA5cDQ== + dependencies: + iterall "^1.2.1" + +graphql-tag@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.0.tgz#87da024be863e357551b2b8700e496ee2d4353ae" + integrity sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w== + +graphql-tools@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.3.tgz#23b5cb52c519212b1b2e4630a361464396ad264b" + integrity sha512-NNZM0WSnVLX1zIMUxu7SjzLZ4prCp15N5L2T2ro02OVyydZ0fuCnZYRnx/yK9xjGWbZA0Q58yEO//Bv/psJWrg== + dependencies: + apollo-link "^1.2.3" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +graphql-upload@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.0.2.tgz#1c1f116f15b7f8485cf40ff593a21368f0f58856" + integrity sha512-u8a5tKPfJ0rU4MY+B3skabL8pEjMkm3tUzq25KBx6nT0yEWmqUO7Z5tdwvwYLFpkLwew94Gue0ARbZtar3gLTw== + dependencies: + busboy "^0.2.14" + fs-capacitor "^1.0.0" + http-errors "^1.7.1" + object-path "^0.11.4" + +graphql@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.0.2.tgz#7dded337a4c3fd2d075692323384034b357f5650" + integrity sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw== + dependencies: + iterall "^1.2.2" + +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-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" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +htmlparser2@^3.10.0, htmlparser2@^3.9.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" + integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.0.6" + +http-cache-semantics@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#6c2ef57e22090b177828708a52eaeae9d1d63e1b" + integrity sha512-OO/9K7uFN30qwAKvslzmCTbimZ/uRjtdN5S50vvWLwUKqFuZj0n96XyCzF5tHRHEO/Q4JYC01hv41gkX06gmHA== + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" + integrity sha512-jWEUgtZWGSMba9I1N3gc1HmvpBUaNC9vDdA46yScAdp+C5rdEuKWUBLWTQpW9FwSWSbYYs++b6SDCxf9UEJzfw== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +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" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +image-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/image-extensions/-/image-extensions-1.1.0.tgz#b8e6bf6039df0056e333502a00b6637a3105d894" + integrity sha1-uOa/YDnfAFbjM1AqALZjejEF2JQ= + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +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" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +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" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-port-reachable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-2.0.0.tgz#54d13d654917eb433ae3ee2dcbc3774f2cd44eb2" + integrity sha1-VNE9ZUkX60M64+4ty8N3TyzUTrI= + +is-reachable@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-reachable/-/is-reachable-3.0.0.tgz#73ac3e3ff1d77af49b1dcd8d02a4bcf2721a4cec" + integrity sha512-bviQzO/xMpY1HV/4vLdLQ2waQu8D9elkNZTKsA1UOlWytU7XnLKP8Yn6GOkoZ52VEiwCCkj7biBhKGbgjtyDRg== + dependencies: + arrify "^1.0.1" + got "^9.3.2" + is-port-reachable "^2.0.0" + p-any "^1.1.0" + p-timeout "^2.0.1" + port-numbers "^4.0.4" + prepend-http "^2.0.0" + router-ips "^1.0.0" + url-parse "^1.4.4" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-relative-url@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-2.0.0.tgz#72902d7fe04b3d4792e7db15f9db84b7204c9cef" + integrity sha1-cpAtf+BLPUeS59sV+duEtyBMnO8= + dependencies: + is-absolute-url "^2.0.0" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + 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.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +iso-639-3@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" + integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isostring@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isostring/-/isostring-0.0.1.tgz#ddb608efbfc89cda86db9cb16be090a788134c7f" + integrity sha1-3bYI77/InNqG25yxa+CQp4gTTH8= + +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, iterall@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +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-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +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= + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +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" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.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" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.mergewith@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== + +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@~4.17.10, lodash@~4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.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" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +metascraper-audio@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-4.8.5.tgz#1738fdac2f5731f5172edca233834b087c9f4c29" + integrity sha512-GuoYuE/+fEkKYOsd658iYlRo2XOWqxKKZM6yMPKnpSOXWJSySZWhfmPoFkz40tadwfBWx01nKnIwwopmiZFXEQ== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-author@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-4.8.5.tgz#444f4685bff8ba4a5aae65a8378bd0b0686e3407" + integrity sha512-3RppM4OjUI7+aWzMoFhIBlqRXi5GZ+1p7N4fYO2ztEDZFopyIHuMK9AbBgmHUb7OEeVvSMKh6OAGV7lRANuYyQ== + dependencies: + "@metascraper/helpers" "^4.8.5" + lodash "~4.17.10" + +metascraper-clearbit-logo@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-clearbit-logo/-/metascraper-clearbit-logo-4.8.5.tgz#d1e672f1804f7edce507317eb6aeb94a88f29529" + integrity sha512-D53DO9gQFwDqgq6r0qbV92YFpLZTW3Zck17WmlkmPbl9wDLH8EOP5AC0S4h9hu40qwqR2gSqIaH298iQJ+gYvA== + dependencies: + got "~9.5.0" + qsm "~2.1.0" + +metascraper-date@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-4.8.5.tgz#9494ac9b4e99e9bd79d7e39972263c87a49f3054" + integrity sha512-m+9deKQDNrrR8O91z0ZQcDnCK7QHFGZnBR8rPYFoWaXxbLVsST5YlT5A6+tYUTswfqjP1FK+r9R0t+5UQA7Ydw== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-description@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-4.8.5.tgz#9155b5c7f64e997f8f12209e0140e7de25614e01" + integrity sha512-0oPEiRXgAyJoQstEPgua0OZ4wD35Htf1oSMzJvejn6rYdfXaeI8RREVtsL/TsUmizyf/iKlneslnfH4/+iN42g== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-image@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-4.8.5.tgz#f679fb4ca110e7aa84dab77813b1d18a7e9fb05d" + integrity sha512-hTvZU2NCnWBOs0xUI8Dz1/ZSPYdf6+UpCp/T9CN9+eyZIA8iRZGqlsPeNIJjVHQ9jf7k2ypnSeYrZnInjXGHcA== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-lang-detector@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-lang-detector/-/metascraper-lang-detector-4.8.5.tgz#68cea1b2b9640393da21ce9717d88a3fe956f015" + integrity sha512-jYyhBjkUoGGl7OHtP7ALUuOwNs9bh/smstQIJIuIM42y7DNccQh1sRLBvcLdweRYB6wr6HIsWo/tdhIhpu/WFQ== + dependencies: + "@metascraper/helpers" "^4.8.5" + franc "~4.0.0" + iso-639-3 "~1.1.0" + +metascraper-lang@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-4.8.5.tgz#6857fd6f45f41203f769b1e3d82d98841aed4ff6" + integrity sha512-HAw+k96lAz9w+RWYNH40CSrV/cuB4sbD4iVfp4taPz2tZ5K0UZnS+OPT9ZJWnSUCkNCWL988TBwza+6N9niI9w== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-logo-favicon@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-logo-favicon/-/metascraper-logo-favicon-4.8.5.tgz#cd6e8aec1be3bf9a944566ea4ce28f837364068f" + integrity sha512-5MxzyHGzySG7axIv5WTRfQ3IAl4E9+F1JGd5+CLGDr1CctOlSUbCcyPo2D5KVJpXDBbL1pW7P7mEvl2Vxz/9jg== + dependencies: + "@metascraper/helpers" "^4.8.5" + got "~9.5.0" + lodash "~4.17.11" + +metascraper-logo@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-4.8.5.tgz#45cb44618e41a5b69c9da8fb28ae4061281b2033" + integrity sha512-fu6Ff9niFt+2HdZgaAI3B5LOIf5BTXA80sE2p+9iW4w3BH15r6N+N42COmVtjHAyJSxYpEWzlF0E3+hnR9qp1g== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-publisher@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-4.8.5.tgz#762d4f257123987b812a919173991432062641b7" + integrity sha512-9DvfBTy+X+rXoKujAC6BHwgfqkekWGZx5ci1JNG13ypYUKztyATrKxy2XUSImUFfL0F7zHVLd3QxrknKimNq2Q== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-title@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-4.8.5.tgz#406de3b443442b34cfffba207d4b53de9343ad98" + integrity sha512-h7MNKZNWUUlA92WsjXg5UyBquyNu6NY7XfDLoi+G62DIBZkXAfrsFkchigyqEJhTDaEH0ualw3RoqzYaEHJkoQ== + dependencies: + "@metascraper/helpers" "^4.8.5" + lodash "~4.17.10" + +metascraper-url@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-4.8.5.tgz#37fe18af596da0e0b999a85dce1b30b6d8adb4fb" + integrity sha512-hmAzyQnRTjYrgb9UI6eEbPoiTqbEl0tUOHDKBNy27lMUxcozvJo16SEUUJKdgyMD2QNXGbmnnze8YyK+nVgaBA== + dependencies: + "@metascraper/helpers" "^4.8.5" + +metascraper-video@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-4.8.5.tgz#d70129ea04889ce9dfcd4216ea71757b4ea1390b" + integrity sha512-EWWcaFYUChHoA2Q9dbALTHB0sETRlDaendGDCXrJo2fQHlBiO/iioCiuUvTJg1UDCF1hFlNWxsBqSBxO9d2wvA== + dependencies: + "@metascraper/helpers" "^4.8.5" + lodash "~4.17.11" + +metascraper-youtube@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-4.8.5.tgz#1f0ccb0170b3844dbc05c831c17c1944c1996c4b" + integrity sha512-CoFdoL9E8+EQe1dYXM5BXciE5A6JMwqCHyaao4hLiAthTCGtAXHTXivSCEqcQckwnKAjxkujVH7DrLixJOFNjw== + dependencies: + "@metascraper/helpers" "^4.8.5" + get-video-id "~3.1.0" + is-reachable "~3.0.0" + p-locate "~3.0.0" + +metascraper@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-4.8.5.tgz#5d8f5aa2190d273a3dbf7abbfb38f1e5c7201403" + integrity sha512-BcM8suZkX6j2MsSRO2O69UXJzqbG7Pr5frOYOv/6zm1qn/RmYgxElFJl9MQfbpewpIhEkFrmfRJqOxnYGPRDgQ== + dependencies: + "@metascraper/helpers" "^4.8.5" + cheerio "~1.0.0-rc.2" + cheerio-advanced-selectors "~2.0.1" + lodash "~4.17.11" + p-reduce "~1.0.0" + sanitize-html "~1.20.0" + whoops "~4.0.1" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +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.18, mime-types@~2.1.19, mime-types@~2.1.21: + 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@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mimic-fn@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + integrity sha1-5md4PZLonb00KBi1IwudYqZyrRg= + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +moment@^2.10.3: + version "2.23.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" + integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +n-gram@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/n-gram/-/n-gram-1.1.0.tgz#c07fb7d6d59aa42d10fbf680fc4c46a30766c1ee" + integrity sha512-S5dWZFQxmEVf7cfyxK9sVyvB0mmTxgL6z9Ww77q20oG8fidOgkwZqsgj7+4DkZVqxdE/Y+0KLU55yw08ssKqkA== + +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +node-fetch@^2.1.2, node-fetch@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nodemon@^1.18.9: + version "1.18.9" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.9.tgz#90b467efd3b3c81b9453380aeb2a2cba535d0ead" + integrity sha512-oj/eEVTEI47pzYAjGkpcNw0xYwTl4XSTUQv2NPQI6PpN3b75PhpuYk3Vb3U80xHCyM2Jm+1j68ULHXl4OR3Afw== + dependencies: + chokidar "^2.0.4" + debug "^3.1.0" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.6" + semver "^5.5.0" + supports-color "^5.2.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-url@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.1.0.tgz#307e74c87473efa81969ad1b4bb91f1990178904" + integrity sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA== + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +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.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + +object-path@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" + integrity sha1-NwrnUvvzfePqcKhhwju6iRVpGUk= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-any@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-1.1.0.tgz#1d03835c7eed1e34b8e539c47b7b60d0d015d4e1" + integrity sha512-Ef0tVa4CZ5pTAmKn+Cg3w8ABBXh+hHO1aV8281dKOoUHfX+3tjG2EaFcC+aZyagg9b4EYGsHEjz21DnEE8Og2g== + dependencies: + p-some "^2.0.0" + +p-cancelable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" + integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" + integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + 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-reduce@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-some@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-2.0.1.tgz#65d87c8b154edbcf5221d167778b6d2e150f6f06" + integrity sha1-Zdh8ixVO289SIdFnd4ttLhUPbwY= + dependencies: + aggregate-error "^1.0.0" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.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" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== + dependencies: + "@types/node" "*" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +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" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +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" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +port-numbers@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/port-numbers/-/port-numbers-4.0.4.tgz#fe1c1fa7cd551f4ceb835b3bbf88c07baa0783d7" + integrity sha512-iicgo0Gltog+OinSw/ESmKOLi4Kfus/OQ6KfN4iOObYVh/Ap13PlFIBulPooBMKnEVm2SUO3Fs2Lk6T9culk1Q== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss@^7.0.5: + version "7.0.7" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.7.tgz#2754d073f77acb4ef08f1235c36c5721a7201614" + integrity sha512-HThWSJEPkupqew2fnuQMEI2YcTj/8gMV3n80cMdJsKxfIh5tHf7nM5JigNX6LxVMqo6zkgQNAI88hyFvBk41Pg== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.5.0" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +protobufjs@^6.8.6: + version "6.8.8" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" + integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +pstree.remy@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.6.tgz#73a55aad9e2d95814927131fbf4dc1b62d259f47" + integrity sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +qsm@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/qsm/-/qsm-2.1.0.tgz#53c5d28424e2900e1b83d8e958bc916552322516" + integrity sha512-v+5GHA5DkXpqHGXnrZMqft2I2esvq7BJTm+EKN3L+BFzKcx/JwmazJzrebOjuOzYrJreT+JS13K78TReKkI17Q== + +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.2, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + +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" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +router-ips@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/router-ips/-/router-ips-1.0.0.tgz#44e00858ebebc0133d58e40b2cd8a1fbb04203f5" + integrity sha1-ROAIWOvrwBM9WOQLLNih+7BCA/U= + +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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"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" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize-html@~1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.20.0.tgz#9a602beb1c9faf960fb31f9890f61911cc4d9156" + integrity sha512-BpxXkBoAG+uKCHjoXFmox6kCSYpnulABoGcZ/R3QyY9ndXbIM5S94eOr1IqnzTG8TnbmXaxWoDDzKC5eJv7fEQ== + dependencies: + chalk "^2.4.1" + htmlparser2 "^3.10.0" + lodash.clonedeep "^4.5.0" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.mergewith "^4.6.1" + postcss "^7.0.5" + srcset "^1.0.0" + xtend "^4.0.1" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +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" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +smartquotes@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/smartquotes/-/smartquotes-2.3.1.tgz#01ebb595d6c7a9e24d90e8cb95c17d0e1af49407" + integrity sha1-Aeu1ldbHqeJNkOjLlcF9Dhr0lAc= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +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" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +srcset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef" + integrity sha1-pWad4StC87HV6D7QPHEEb8SPQe8= + dependencies: + array-uniq "^1.0.2" + number-is-nan "^1.0.0" + +sshpk@^1.7.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" + integrity sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ== + 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" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subscriptions-transport-ws@^0.9.11: + version "0.9.15" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.15.tgz#68a8b7ba0037d8c489fb2f5a102d1494db297d0d" + integrity sha512-f9eBfWdHsePQV67QIX+VRhf++dn1adyC/PZHP6XI5AfKnZ4n0FW+v5omxwdHVpd4xq2ZijaHEcmlQrhBY79ZWQ== + dependencies: + backo2 "^1.0.2" + eventemitter3 "^3.1.0" + iterall "^1.2.1" + symbol-observable "^1.0.4" + ws "^5.2.0" + +supports-color@^4.0.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.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +symbol-observable@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +title@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/title/-/title-3.4.0.tgz#17cdfae82602f87777f137047d36ec283389c9e3" + integrity sha512-gabSoHN82rROEFIkWr9GkwqTFihjdvumQflWsvwiNeIDpJbZOYrg3bXpR0SY4QcghGM1k5QrnI4k6XAiJwOWVw== + dependencies: + arg "1.0.0" + chalk "2.3.0" + clipboardy "1.2.2" + titleize "1.0.0" + +titleize@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" + integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= + +tlds@^1.187.0: + version "1.203.1" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" + integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@>=2.3.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +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" + +trigram-utils@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trigram-utils/-/trigram-utils-1.0.1.tgz#9248b88393c696095640eafd8d529d30761094da" + integrity sha512-9xJJ3zcPO/b60f9TF8svW9Q0HdpPebiTh2juIVSqcptwvxybOtek+YwbC+k1qf9TosNYyyC4JtSSFDGw+EE+gQ== + dependencies: + collapse-white-space "^1.0.3" + n-gram "^1.0.0" + trim "0.0.1" + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +truncate@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" + integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= + +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" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" + integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url-regex@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-4.1.1.tgz#a5617b22e15e26dac57ce74c3f52088bcdfec995" + integrity sha512-ViSDgDPNKkrQHI81GLCjdDN+Rsk3tAW/uLXlBOJxtcHzWZjta58Z0APXhfXzS89YszsheMnEvXeDXsWUB53wwA== + dependencies: + ip-regex "^1.0.1" + tlds "^1.187.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +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" + +video-extensions@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/video-extensions/-/video-extensions-1.1.0.tgz#eaa86b45f29a853c2b873e9d8e23b513712997d6" + integrity sha1-6qhrRfKahTwrhz6djiO1E3Epl9Y= + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +whoops@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.0.1.tgz#568d1768386fde94a27d80983bf207e453e78f20" + integrity sha512-XlSRD73wKOGE7SgOAsy6HCkcKDS6AQjjLW7egPzYOSOPU99H1QTioxobQ4cCP7a5ACjzNdd3/nxUXOn6ysijkA== + dependencies: + clean-stack "~1.3.0" + mimic-fn "~1.1.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0: + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== + dependencies: + async-limiter "~1.0.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +zen-observable-ts@^0.8.13: + version "0.8.13" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.13.tgz#ae1fd77c84ef95510188b1f8bca579d7a5448fc2" + integrity sha512-WDb8SM0tHCb6c0l1k60qXWlm1ok3zN9U4VkLdnBKQwIYwUoB9psH7LIFgR+JVCCMmBxUgOjskIid8/N02k/2Bg== + dependencies: + zen-observable "^0.8.0" + +zen-observable@^0.8.0: + version "0.8.11" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.11.tgz#d3415885eeeb42ee5abb9821c95bb518fcd6d199" + integrity sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ== From 3b49e9fa84a86f854df02d5b1ec7fb725d7db204 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Thu, 27 Dec 2018 16:41:32 +0100 Subject: [PATCH 002/130] Create README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..c2ed048b4 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Nitro-Embed +API Service for fetching URL Information like images, icons, descriptions etc. thourgh OpenGraph, oEmbed and other standards. + +> early version of simpler embed api with Metascraper and oEmbed for better results. + +## TODOS +- [x] Metascraper +- [x] oEmbed +- [ ] API Cache +- [ ] Image Caching From 18bfc85dcaa707ee9443f224f70d22cd3750eb3c Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 12:55:42 +0100 Subject: [PATCH 003/130] added 404 error, better error correction for oEmbed, audio and soundcloud --- package.json | 1 + src/scraper.js | 27 +++++++++++++++++++++++---- yarn.lock | 7 +++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 4e59f09dd..77ea21967 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "metascraper-logo": "^4.8.5", "metascraper-logo-favicon": "^4.8.5", "metascraper-publisher": "^4.8.5", + "metascraper-soundcloud": "^4.8.5", "metascraper-title": "^4.8.5", "metascraper-url": "^4.8.5", "metascraper-video": "^4.8.5", diff --git a/src/scraper.js b/src/scraper.js index 8c44dc0dd..834fad11c 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -11,11 +11,15 @@ const metascraper = require('metascraper')([ require('metascraper-publisher')(), require('metascraper-title')(), require('metascraper-url')(), + require('metascraper-audio')(), + require('metascraper-soundcloud')(), require('metascraper-video')(), require('metascraper-youtube')() // require('./rules/metascraper-embed')() ]) +const { ApolloError } = require('apollo-server') + const got = require('got') const request = require('request-promise-native') const find = require('lodash/find') @@ -69,31 +73,46 @@ const scraper = { new Promise(async (resolve, reject) => { try { embed = await scraper.fetchEmbed(targetUrl) + console.log(embed) resolve() } catch(err) { + console.error(err) resolve() } }) ]) - return { + + const output = { ...(removeEmptyAttrs(meta)), ...(removeEmptyAttrs(embed)) } + + if (isEmpty(output)) { + throw new ApolloError('Not found', 404) + } + + return output }, async fetchEmbed(targetUrl) { const url = urlParser.parse(targetUrl) const embedMeta = find(oEmbedProviders, provider => { return provider.provider_url.indexOf(url.hostname) >= 0 }) + console.log('embedMeta', embedMeta) if (!embedMeta) { return {} } const embedUrl = embedMeta.endpoints[0].url.replace('{format}', 'json') - let data = await request(`${embedUrl}?url=${targetUrl}`) - if (data) { + let data + try { + data = await request(`${embedUrl}?url=${targetUrl}`) data = JSON.parse(data) - + } catch (err) { + data = await request(`${embedUrl}?url=${targetUrl}&format=json`) + data = JSON.parse(data) + } + if (data) { let output = { type: data.type, embed: data.html, diff --git a/yarn.lock b/yarn.lock index dd072e74a..3db4db7b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2275,6 +2275,13 @@ metascraper-publisher@^4.8.5: dependencies: "@metascraper/helpers" "^4.8.5" +metascraper-soundcloud@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-4.8.5.tgz#6593ba8a26fedbb4a3bebc6d2803e22b38278621" + integrity sha512-fChxmwqCLyans9RKKg1jaL7dh/6twIBgaQm/NjvlKcp4+V39J85wQlZPHBgoXl+K/uMwy94wMftKWWQ1Hxxgkw== + dependencies: + "@metascraper/helpers" "^4.8.5" + metascraper-title@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-4.8.5.tgz#406de3b443442b34cfffba207d4b53de9343ad98" From f44121bcc117b2e7e9421de1a3b755d325ea1bfa Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 13:03:09 +0100 Subject: [PATCH 004/130] better logging and only in dev --- src/index.js | 4 ++++ src/scraper.js | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index 7015e0a53..7c6e1432e 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,10 @@ const resolvers = { const server = new ApolloServer({ typeDefs, resolvers }) +if (process.env.NODE_ENV !== 'production') { + process.env.DEBUG = true +} + server.listen({ port: 3050 }).then(({ url }) => { console.log(`🚀 Nitro Embed - Server is ready at ${url}`) }) diff --git a/src/scraper.js b/src/scraper.js index 834fad11c..6bed1a522 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -67,16 +67,20 @@ const scraper = { meta = await scraper.fetchMeta(targetUrl) resolve() } catch(err) { + if (process.env.DEBUG) { + console.error(`ERROR at fetchMeta | ${err.message}`) + } resolve() } }), new Promise(async (resolve, reject) => { try { embed = await scraper.fetchEmbed(targetUrl) - console.log(embed) resolve() } catch(err) { - console.error(err) + if (process.env.DEBUG) { + console.error(`ERROR at fetchEmbed | ${err.message}`) + } resolve() } }) @@ -98,7 +102,6 @@ const scraper = { const embedMeta = find(oEmbedProviders, provider => { return provider.provider_url.indexOf(url.hostname) >= 0 }) - console.log('embedMeta', embedMeta) if (!embedMeta) { return {} } From 32fad6118c092511f1f4dc6c85a380590ea24b0b Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 16:08:39 +0100 Subject: [PATCH 005/130] fix youtube start parameter --- src/scraper.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/scraper.js b/src/scraper.js index 6bed1a522..8dc80effa 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -19,6 +19,7 @@ const metascraper = require('metascraper')([ // require('./rules/metascraper-embed')() ]) const { ApolloError } = require('apollo-server') +const parseUrl = require('url') const got = require('got') const request = require('request-promise-native') @@ -57,6 +58,8 @@ const scraper = { targetUrl = targetUrl.replace('//youtu.be/', '//youtube.com/') } + const url = parseUrl.parse(targetUrl, true) + let meta = {} let embed = {} @@ -95,6 +98,13 @@ const scraper = { throw new ApolloError('Not found', 404) } + // fix youtube start parameter + const YouTubeStartParam = url.query.t || url.query.start + if (output.publisher === 'YouTube' && YouTubeStartParam) { + output.embed = output.embed.replace('?feature=oembed', `?feature=oembed&start=${YouTubeStartParam}`) + output.url += `&start=${YouTubeStartParam}` + } + return output }, async fetchEmbed(targetUrl) { From f8f0ff3d06a51a9b1fba54d169894f734054c2d3 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 16:35:36 +0100 Subject: [PATCH 006/130] added sources to results from which data was aggregated --- src/schema.graphql | 1 + src/scraper.js | 33 ++++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/schema.graphql b/src/schema.graphql index 229745bb6..e7108d3ef 100644 --- a/src/schema.graphql +++ b/src/schema.graphql @@ -12,6 +12,7 @@ type Embed { lang: String logo: String embed: String + sources: [String] } type Query { diff --git a/src/scraper.js b/src/scraper.js index 8dc80effa..9399cad6c 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -26,6 +26,8 @@ const request = require('request-promise-native') const find = require('lodash/find') const isEmpty = require('lodash/isEmpty') const each = require('lodash/each') +const isArray = require('lodash/isArray') +const mergeWith = require('lodash/mergeWith') const urlParser = require('url') // quick in memory cache @@ -52,12 +54,15 @@ const removeEmptyAttrs = obj => { const scraper = { async fetch(targetUrl) { - if (targetUrl.indexOf('//youtu.be/')) { // replace youtu.be to get proper results targetUrl = targetUrl.replace('//youtu.be/', '//youtube.com/') } + if (cache[targetUrl]) { + return cache[targetUrl] + } + const url = parseUrl.parse(targetUrl, true) let meta = {} @@ -89,10 +94,15 @@ const scraper = { }) ]) - const output = { - ...(removeEmptyAttrs(meta)), - ...(removeEmptyAttrs(embed)) - } + const output = mergeWith( + meta, + embed, + (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue); + } + } + ) if (isEmpty(output)) { throw new ApolloError('Not found', 404) @@ -105,6 +115,9 @@ const scraper = { output.url += `&start=${YouTubeStartParam}` } + // write to cache + cache[targetUrl] = output + return output }, async fetchEmbed(targetUrl) { @@ -133,6 +146,8 @@ const scraper = { date: data.upload_date ? new Date(data.upload_date).toISOString() : null } + output.sources = ['oembed'] + return output } return {} @@ -142,16 +157,12 @@ const scraper = { // const parsedURL = urlParser.parse(targetUrl) // console.log(parsedURL) - // get from cache - if (cache[targetUrl]) { - return cache[targetUrl] - } + // get from cach const { body: html, url } = await got(targetUrl) const metadata = await metascraper({ html, url }) - // write to cache - cache[targetUrl] = metadata + metadata.sources = ['resource'] return metadata } From 8e71c27b52af9b30d8eec5712b4c7a95be954a52 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 19:43:29 +0100 Subject: [PATCH 007/130] fallback to link type where possible --- src/scraper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/scraper.js b/src/scraper.js index 9399cad6c..7b1a6ad60 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -140,7 +140,7 @@ const scraper = { } if (data) { let output = { - type: data.type, + type: data.type || 'link', embed: data.html, author: data.author_name, date: data.upload_date ? new Date(data.upload_date).toISOString() : null @@ -163,6 +163,7 @@ const scraper = { const metadata = await metascraper({ html, url }) metadata.sources = ['resource'] + metadata.type = 'link' return metadata } From 053cc868883e7ad2d3dd982bf402c6c50b698c8b Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 19:52:32 +0100 Subject: [PATCH 008/130] Improved readme --- README.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c2ed048b4..d8c0706a1 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,45 @@ API Service for fetching URL Information like images, icons, descriptions etc. t > early version of simpler embed api with Metascraper and oEmbed for better results. -## TODOS +## Todo`s - [x] Metascraper - [x] oEmbed - [ ] API Cache - [ ] Image Caching + + +## Install and start development server + +Install dependencies +```shell +yarn install +``` + +Start development server +```shell +yarn dev +``` + +## Example Request +Use the following request by posting it against the endpoint or open the url the `yarn dev` script did gave you and fire it there to get your first result. + +```grapql +{ + embed(url: "https://human-connection.org") { + type + embed + title + description + author + publisher + url + date + image + audio + video + lang + logo + sources + } +} +``` From 9ddf89d874461363035ba881228542080884a2e6 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Fri, 28 Dec 2018 19:58:48 +0100 Subject: [PATCH 009/130] Added API Playground screenshot --- README.md | 5 +++++ screenshot.png | Bin 0 -> 110105 bytes 2 files changed, 5 insertions(+) create mode 100644 screenshot.png diff --git a/README.md b/README.md index d8c0706a1..be2a17020 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,17 @@ API Service for fetching URL Information like images, icons, descriptions etc. t > early version of simpler embed api with Metascraper and oEmbed for better results. +![API Screenshot](screenshot.png) + +--- + ## Todo`s - [x] Metascraper - [x] oEmbed - [ ] API Cache - [ ] Image Caching +--- ## Install and start development server diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e8359c47f4baced42a4d8f72b03094aefe2b6223 GIT binary patch literal 110105 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≶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ℜee zMUr*mO4o}!vO5#UZ$^{1bwmNp`zW6EqR_m6hnf?N#OUO{)#X7?4+011Er2Yo)YKl@ zy Date: Fri, 28 Dec 2018 20:01:42 +0100 Subject: [PATCH 010/130] Upgraded screenshot --- screenshot.png | Bin 110105 -> 114913 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshot.png b/screenshot.png index e8359c47f4baced42a4d8f72b03094aefe2b6223..cd6f87fbaacef64332cafcf2116b7d784255db29 100644 GIT binary patch literal 114913 zcmagFWmFa47ce~ca_R2w4(aahl$5-nbR#Ks0SQTw?go(t>AHZFNJuLnR}_%Gbi>2% z|2&`GFYl~%)|#1fX7|~%XYW1l^mWy6v8b>B0KnBySAGrv=r90)IAWkY-Cn1{sg^!NCD9FF%=pGzq6TRf82VtMJv; z6)7N$f`WoW$Ad%7-r4_UdwWY#Qrg_y5)WV}1&d;0;@sXp;IZ(LJ(DM8<|Sj5r0(z{ zqh~!lMbh$05pwZU_xO;B%buN`kx_^PwT5I^VoVJ-Wb_i$pKYjWU8x$~s9HU#T0F?J zpF21>k^uZv)y@=2R%A5dAUbZ!Tsshmf|N;uBF>y#RgsK9jEqE#A`=Rt;Q0OfH<`RV zh=`f8;3dTe8xmp=Ho!>!+JHR3kUYegl$Ms&3+*6O@ ztr=yR0|m@O`)u@_2X25imI4$4DoRQ! zTw;nuV1O%eiHbugr=a-g?2_mGFKW0i9V7qv_&B+(_QU1j{mG`dvc8b87?rlaf|k+X z;2=9}Ff}t5kDMneHlBq~5)Y3XmrcyTz!1zNLLqD2)Z7xAobDMEaa99R)ic?3d5OD?FC>mC0TFT5j$U-8v0`Ep=Ks zj5Yjcy~vw$k5}d#+HrjLfI;zj46H!V3!sularg*OVUxd}xX91)<$iI|+H^TSa{gTD z8I!moi-I641o$WiQYfHysIFXU6KZkXhyzgAa^%Y%&)IQdV>v^XhW^_8!$Bx{(?_V4 zcSWzLt@|SdjY8L*EKt-VB3l1EcaIlly<3g=KG2(4}G&onC1G0L#w<@2dF4QM)tl_0`Q;S@PM%=m=brf7 zE~f@_y}XN+*DTgi+cMEyq0YfKfw;-LUD-Fi&b|B;F~wp`PW+o?NY#{$gyC3Ytv6Ak zAx&Gs>BX)Nzu(5i#Yq-(Iljh@`bl4+sI07<1^l(-_XDAAfc~4CLfd9=R15;ud`V}D z6aaAw45BkIQDGbntQmGP2I5PY27yLdrhYO_pO!ZMVpPcyW1wIvjldvY6-mb-M(l!B z1!J%Jo(F1VpB6>g_OLQh#ZPA=Jl58-5?_JXuX<|7wxlC%Yp3JlVm91IfPjA}7>Q)-*A0f{GF4hi7+hye#3$zV9ee z13w%sor%G3V?FV2n|Kf$D!&HV#&Dy>ryxRb<#{o&RA5j2XvN)VNC4iw_UEvK2x@fJ z3`?7|u-B+BQ2;PYLbqH_s79|e7g3jwvu2fjaZP7G2d=SzYmcK!H&^tp(dE5PTIH$a zg+C(tPrHBIgR&f~@c2R&`O}q$J#$Bl>=h z$V6RMxUSV!3sjJ)G@;{L;Ylm1s9ax|C^1H(N7&=dX9H&jR|>M_rVnDyTrh)7H8U*qm#M_ff9hR=%;#odw+x$WC91rD6Ua*%sQjvJ($^|GO}o zVMhTC{g2nTa>(+ik&d3KvQ^SYc0p;XOkpR>}+fgn8LHWqLP(L*QVPl z%9l3qY0Hq{>+epRvpfY{)OL}T1IBYWd+!D7atIQn(9!#OYy%GGT3f?Pybp@sC#?C{P_CF_2z; z*)u3J6F&R!qL z6VeU~nj`zvp=$5I01|Ur>bLK~u8tYJpher#!ge6_JMhhQO0Qx-5I*jHt+;hUtbp0t zI8Y+FiPS4S$KPub8VDyl9qlTNU#RJGVjlQE*APoet}jwHJPx+o_zr=5EA8lIOK#3T zhwxO-Yt~Q`UZs+GZEbOR`<2QIDM2f--0N7~9iIKuz=;uNac;_{rKg`ZNmQ5I%F9)m z$NH(6W1mxt=CY+{6^gu2lj|*Adsl#rU5EShPM4 zr?mBy>s4a$vsGH`#F66fnAj7{5v)`!T#tt@e)151sJCc4!*!Gqh@OKhh(#mby;CFN zL&OvP1g(r5Vr3KQc1$FgY%j{^F+t@}zg@S&N+j5z)U2JHL=mU+(GDLCiE9)E@+4AU z)EOxp%XemJ=1!AsYqu=eRlcLiltC>5#56**~;HbF*LpDomyJ^^TZYZ)Lq#>`noBw5rH6vPD9Y*Ukp z^A!Hk#IkoU@Y*2%hhL3f?c4htKY6X{S8a7aUOllKYH!&4)5C+I7l!%4m)ZDB0IIe< z4ilHpN?Z?gFyq5v4J^p`I0+WyCBTIcoy5cte}(B9BhvfL$iNI=I9-Z{0LY4&Bx?~C zK0O__W5l4kW>!%Y%3{~VEYWxuMMr;sbGi^~TJ(tgEoKozgsdtGf4FwEkqPrU`MpfR zzs@pJaX{H2hlxEs^i1bb7HXY(ks1ES--3gZ1~Ov7MTt+fOx?<`CNILb*R0+Rk=|Ob z-x-a#-18{U1B*ry&a*xbe*v)zK5!#y6gIZpm>QaBW23m?Ei)Hg0{h$kF!AlpGI>bs zs1?XEDjII?_OB+$&dnT7cPMt{5!5tTv{OVdcqh&lznc4LNlYA!sba6(!?%?8k@z1O zAC#tHJB7etz8f=p#C%hp(4ab0iB#l=9_TcIe7!4h2>UA1bbv3=2tIBO_sgA#$2T`5 zlLe!gb0)>otF!k8PDd*@7O)z97>IXu!>%J{BXp{1Ggv749O~!i7j(Us!KI3dgSmXl zjGP+yQ*)CL!1#Za}g`5Q|RMeCT3&hQ-yFsCwnS?EA)8qj*}Za0^)YHEQL+B=%vB1L8S5F-3uTt`UsL)0 zR6=67D0GJ5O452jcAX$qyS#3JQGzkw>R4W=>tRq2T*99CkR z-Zk1xHhG(-A6ID;5k?ES+Z(kBJwIOR4}Q4IqvyLiWT~a^mllT+BI;mjI5adDIIF~7 ztYy#2H+mtf#jfL-{^W!<#Fj;*Wmhr9y`@_3Zu{Re?d(1{aGu~L`Tupvw8zTW`B;rn zvHZ>N#%wS%m>YT^32I?FkxW<7@?=F+%2;I(7HTR_PL?wx|rwn;iog`vaKtwJsyp?}T(XxFJ!{klKXY48hk9dao23;SvSb@Vp z=9id(&csP-x+)=O2M$pCA$ym%KX5*HN?u}85TN}o0am+SFJh!pa(!;;WpU)SJ^?>a z2CkFcv`iPiIjk1r^Fnpgi=7*;)SC>N^l`~9Xx(eZn5E$ z^N)&+g#Ovf@=V4wd;3L<`sa6xxFMcDJpd@S;_E373}X4W_J=1ZD)98@KGre}rsPKj zCFY$P+Al9S4Vv=O7~+@K8`OoXNtXY<4*EBx95*6d zJOGTgoonXEO9r+3k%U3)S_P37Xo}4ahG<*XvxY?LTD3*fNnv{gqAa~yli>A9y70rH z(42uHYfeR3Aaj36Gh z&!`{VFk>1Y)>ti9t0~1Jba1q)ti*`>Y4$3$Qy0$q&hiUq`;S)G{}|0$HI1xH1@~(H zF{MXWo8J1R8b-mPw`O`qRMu|S6sJmh`e$5(^(HwYvXGm9Oa z7wXC2pOioILAQ66r*T#M>e5&yTd~o!X6Pee;kS1Q>tPQ+ushn{FR_6<(P8vPkq(c= z5FPGc^eCc_<1Dr12q9T87qlk=bYw%k$_^!pFQyj@F{A9Ifxc|=YS+5Zo++E9=;)o=4;!FSBs z!#5AVG|XHdH^QYbvF9GoL|F)ZP>@w+sS;k3=5P&LF)-VJ?Du}$aqJG3Fcit20@&OO z46t>bVrWbp&eskZLqil0wKWp_aNau|LVCl^hY&+T!4GE( zQQLBlIDs?n>idT)?_o_V?}3wb-Y<-wHbcUeJEW_wbU_KdIoB6c% z6BokOnHzEAhNNiw9Jpn3ZqE>GR>n?kf)iIfxO>K;_$_5V9`pfP?>)7h9S9i(YB&iI z)?Xkcb@iB6%LeAV%LJ(<@BWKwn0zu+-cl%*p9>zcB0lO1Gzh6xJU^CYhfb}3gu@Z* zV&eTaaD|GrePzUBxWpG7M_XEGwA^gJe@^?7RqUAH>qn=m#>0cJ%$hY`%H-iMDJ7Ma zUdf*D%5yzsK<*X%}ZeXlNi$LEKGU>Nx>l{g*xBd|;`D=3CAQsC zxwURbUsli<22Huh&A0Z0x2`ryy8{1o1{Brt^73AVVtW(VG#OiqFt;;tE?l7e8p|aOZS2x!A!M|>K!RO@Y%NJ(s zYQH{JsrWbga?IkURA;q5?fsb9rk-~jLC4P?&+ERwm=S<*Z=!w^pt49Nf-9urPQu?@ z4N-`DWLCWP&UrVRVGt!jw@V_84n9PJ5A)7{bm%XUa0zu3!H&Xd zY_A*W)Wow)Jn7WN)Z+1ju%yxWQu2OW|`v5RD2n z%%54}cuUkS(Y`B*cgfQD{P6RvcT^x&gmyc-Pu&M#Q>BGJX~y=!?kL%S8oiVsKqo6i z_&KY-cfF#L7=2rOGtj)yxFf1%hSN9bOXv0Ht38E&6Z!J2quH|mC|=qZGv?8F_oSIe zLP0!%Hn@VE-tm>GL+i&+E=_`;cG~m&i(TsXJo8k`-B8TL`%t+1@U^J&lG$#myIx4A z>kg(QjJ|81SHHV+PkTNpso2!Mv}ChvULk&NHh9O3hU}M{>xIfxCeO6I@4#Omyz!;A z-A6ezALB#EzJB5QljMZ`5MhdMQ#Q)gprfu6eOIpYlCeMNnl7_|+B>LQZNmfL$69HL zb@3osN-J7uF^M)g-QAH`2mIYZG!lC>0N=%&Co9017@+L8o z08@&iBL)>oygs;yKuk$>t4O@J8XQo@c-QzDMxI41fzV`(h9ie?$GO(Dt*FAo&N9&* zKzF4GHf|u}Z1AS?v~j?7;lE*Uu1e5*p94MS;|yVgop#RTC1qm(MZ5GOn0 z0#ZLbC*Gt8pvX6T<|Kd*eRl`r^?YK-)uh|Gqi!4+u>k(1@_t=yi-l{jBgR^O(1&Bo z{kmf{VQs?z$%kvd0|lx}YQs}cKdmO&D22`Q$#NTlfiqO{;@FBg2#thZ7tfx~#bU*G z>8;~{gdbc0EX+*t0Z+3EQ=G`>SGUeTvkTd7y^((?D8LzH8xgT13sUQmzB(HP@ShUFEEquJgd{wSqHzLU+_~(`te6Y6cJ#@fDwtl%}gM7 z+`vvG*bs_i%$6HtyKNx{@VjC21K%vbIDjV}1%M?E1u&il2Lc9ScpAkp6g1d>1N=1k z-}wJ5h?pp(tr5n7cu}+m(7fV^>^$I)7;5jROVg4#LF2-U=H<1kL!DE;4}0-Jn{i@P4unK+d{W@Q2$^Og0H85@BfQjfSm5@2G^+Sj+OLEU z01(m-o3=BMI5;P0a-&d-;?KlwTE<63gN1A9)P1n1@PnZjAAgjj!c{D%<}=*q%miTJ ziJ_@yc0f$fkUK~NrP2o$Xg2w zgPBP2KzqLq7Al)vf^^;dJMrGosvUs;!(fvy(2UGr5}C@0ZpdJta@gG!XGK%yG7_7COT@)#Gny=oFS?{k?C%Tc+*zr-x$n5YQXhp(vk2Z8N4g_kJN7+ zqnbQ$twpkN9V46~#`ZC^hS;k)8uMy+8gS?dRAO5pgF7~#gBB?}cW8Cbqsh6VCKjMC zVZ_|u37|Mb{E1zK+ZKXJzrdn#+)MAagBaJK;KH%RLYRoh=91Kku=~V(8yNY+%)gBn zE}4`v7ZG+KwKj(u!F~AgBs7E0O&Y}fAKGOeO;1*`zw0jgnvyN8OUosB`H_X%RmZ-P zooI;4%1QbNEB6Z;6XOqy~c&r`o20MdO|XAg73S5&Zb{&~lgUAKzelWMIl zdr!o!ivpWX_iFwJzGoZO-u?)QUx-mf6_~)2yli$CH$&kb6v>O7_<^Jd@!g^RKvHOu zw{?0??l9H1NS(6}g;!0Iv_qnhdt1dApDB_k<@5juxv)04AlbYRM1^J%mTFmdnlqLY z?dBsJ2|k3amA#!pEcj`5+=dFVx392RX1@#NY&=_93bzH1xc-kp>2-6i=<9%c%s{~d zwYgL0`6As+z~f}*k|HXVPb9a`RCsb;PbV98+L3z0+o0i>vmI+$I$;&A+=hbuaaD72 zwJ|jOa+ABK5opx?fcPUsXM)w~ZTf|)A_!`@fC@V@8<6rTC-;qVh|mF+^gY-{wE$D2 zCmKxa5Nb33Nx0#WYF2Y+ijCNd1k?*}Gy|In705%HCgP24N0|sbc$Ht}(PqOoxf~G< z)YydLmUG%tL`>_8kUO)8l%j~=Sz5r}XA6&v6*BIQ^EBJNu!&BqhAdriU{$iN{USI3 z{l-9&r~RU6j^EAqa_{_C7AtHak|c1e;RYKJBmB=)aHbSIZ(P;6f&Qe@cBB^`J~rT5 zNzbY(kgNlUBNMUSul)8WS^T&*E%hyd=BI$l>MLDgJLz{sh7)D^o*=|=?CfD$tRuc0 zM+*J35D4w_Ch8`Inzb4HueVL9ZJMK;5(Nt@51 z1O&c-PMj>9dn$bjdf*9qcYn(z@}K=SK1xou7k`Ni{LI3L`%6@G*z3mjZmHrQ_mB&m6=c848MvBH7ye!n$)iOFH>XB?G5>l@ z0Zz1~xUdns6=69t`S(Kq#^`kW!9y5SWFrSkV2HVqZNQ2}fk#wRmZ)pzVwag!m>8j^ zzvPH_HvIe9eA5maP}0+^z{jUgvIU3v_<>E7%=_0p+ATEYSAEFgGHX@!sq@U5H}(@= z8jVG1ePD~2ibbJWst@z5y`-?sbDJRAt1M8AbpC(4RfDp2TtY@47X;%-q@Jj(a`Y9a7WBdEm- z*KFZvex;#ME<9{E8~ruxh&YRNlM;>z@Ekgp*GR`&tKHBbesKOH4L3H%>Jf#PNO5OW zO>XaqKq!Xz_rvw$oK6qdmB0;GYOc)k?IcK=W7VgxEB2TH4~gbubC&SDk-0EPJ7y6*nCt2ckVL5-@!D; zWUeF6F=wt?#Px(V^l#o|T`2jPsr`{%2r5*a@BKd{Qe2j6Rc0Li^D2EO>WoF~Y8zHa zLw74(`&K$MH1O)H+${Fz;K2Q5t9tT!qv|`e-{jsQFOMExte_17i7U-GtdNKjoBHsW@{5WFLfun{n97pnB{I*@c4h z?|5ia|MfzJF>8J%dx>`6UmS10ff>4dQejeANLx-Irfpxypc^?>w)q;--Xwf}qFJT2 zV6s!Bsw7bbbTfj0#EBxJ|w+c0w@xo=_KTN4~Ue_?5u_N4aQFUr-pFp#B# zf~f0jiMCv`r4Di%&Sab77L)kpt|eRSqdw&X(~)R^bn?g5n7d75LPV=f#1e{S?+G!o zTTJ^YWI-4I%n9diN$|!6^PGlJNQPij0gc}wA@`+lW5izpdPLOm_KUu!o#v7S<$@~^ zJjEq&HsZ#PzRof4*NuCBh2%iNyK}LZ5@D8VtT(Rw@W`j2Of(0kV(NR?)1`7RLJ#Fc zUK!WtKM+9ym`XEd2iggkXI`PN=YKb3O5dP&K%Qc?M)gT{1Q7;50B6$vUo3~O4OjX9 zyM$FJ6(5c?VDf{|s93JGP|lZf-?%qe{}lNRYJ7Ke`|F4Ekr7S75srS&DM(v93s|z< zFyi(Ll*;R8M@1OeKMIG-Ny+RKUfRN8E z>uM^i+flO0=a(4(iW6j~p`Q*)PP&8Nk;8U|$q#c-N4eX_1o>Nm-O#}}#f%t8FsKa$ zgf>F}35)<%BA%X!`P>f?SAreL!$86)AZsSLKLZ@djR5!vp;EP|W|a23n52FoFm%`> zGyH-9{(1|%f6dk!y)%KN;DQDpv(}P=-C~Vl_wwQ+*1t>pb)i>Oiq{I{@U|UaNj{PP zp^mkO$&A**O;3d-M_w%vaP9jBfZV8^ksgXLt1MvUH~y`k+Ykc@io6k%a;ds~J7wHG zd*lc+?A7CCruf<(=s}Ji@#k_J*GxzGRX(`q2)sJ<1x0qF8#M853wm1TUN_eb?>+?Yi{<^ z4(><6Q&Nw@CjU?BK}@kXWX{(wK7tt7DUJmIW9%|cr8U7s zqnUkIdJMBX3%yOYBZgfx?XpumJ&~~>qt76MYn;h2!Ep|y#?S>Nkn1p=_anW$(?FPV zq3hYpXw$ZzB02-I@?%vI+E&um9Q-DbyCQu^$o3_++3v64?UyxgqrXd}95tvmqggrp zCcdwL#G3Y_3oqKvXFB+J{{4=ts#&Z$L62>g`>(;=g#X&QdQuOXQE-CB-WOK;yFpVi zfrO{EbY9399%xdky3Q$SOzrLb?O?@PtbHO#V>?vT`)ln|S* zK}9Vk(|$cTuXu<;KS7Fx`b1Uue^lXPEaMC$$(E0sAu+$RwmbjmfPMK&o+2x8)aiH(YKp!S6q}ki6?=dS4a8*W9;@@g zO9ZjD{(ha^Au#BaT=J*bXuBEqa<>!2Y^&WOK=CHf8vb%Qy>%Yv#>CJPg$kBs!ZDO` zO`!VWtD!70e(||Op~zn4>q^Qyag}yhNWv9elO0TUq-mkH3%9YC zrr@JK$K5j!c~Qvt9uq=t>?LR@T5ksj_M1zE{7wh1>iSHbVJn@j@q@;MfRvFeW}peV z>$oE3HK#?M3^&5fvo5Fy+iZ=;4RzCqYa-i)14pR6jq&$IyxSceuaP4^iE3XZ>rx;O zv=T3Ab8n1QuEe1BI~v8`*z@~8t)AC92`n#+DS5v|w58>8yO)boU_#}vvey?etDSh| zIK-Pqc_FdI>NmHbA0=_Us2UZogwh+}(StTb$i2Z!4)DWE z={}IFY>WaZCjRvN4{is0a-{KlR7-*f<$k*jDZf%#ObxVKVcg6e|vruo_rGcz6;MLhX(d^v5e1GXqt7P8e;S z^G63s9PyYVBvBdL#B-qH4td)H8zu2S1TW_4G5V|iLghIZ31og_Q*@FEi*OHGuiz)ca(pHU@UU-$~~WN=da4zh-{_%J%h~*9qbL!f>a|&Y#(f zqqUJ1*otuB?YQ5~zd!tcJ_dfVHFI3(@;~J5i`Eo%8`^<$u(e3NKHIwvfna-7Fge<2 zaG6>cW20UKK(tGP46euoy$F%$7gN?t&J^)~2$~p5j7HrUPvm3!6n#at3Z>G?u13CZ(#%BYr%i6u0mFK0`3jgsc)nJ z-W2Nv1sC5hW8*T!(nMR!sd!BHAXrkXgM59OLv9NDdM-$;YOcD)6nM>vCYAI2WCG`k z8!(g@1z!((W*OwK2tm<_e8?3HK~V#dUuOR@z>VPJpN|g)mVJNQzmePzr7D&jCq!%;2xoKsXtCZiU>!dcVZ$JBBpqX^gWFl*2 z7J-L#qXzt{J%ohTEwBMsZ4a|J9q#xXoouRyl%ZPqP!txzdne4UFTxhdIMY&aF;H#9 zydF7Fm0Px3sc8k!V7l+4Oc^HK8wCPltHgt$*hX~CVY=U#nd)T}XirHlt11PsVd%`l(_>p4ts|dGtg{>ylO6a1g~LZa zu5HziQa+V$>{2zN3#u2SQGU_6YLZ`3laQ!@;E!pdAb7Y=`y~w3TjT`z1v)l6P6zT0 z$h$$%scc7A31c}FgutALNl|98!M|81_piLb)~8&bI3`Q#mIN%<1izh@mywUj#=454~YaYvNrl4Q|ARo&CM1T1Txwkgn8Kw1{ZX>z_ zm%Rhq%Wq96GJFqqA#HpB8yk^^&F3-lwl=;@N~E667X=Bz*d3<>;q@|B{P}@Uks)uv z2lMxF&SN&Bbgq0CC7Ovoq&VlSi$hu}MUqf`W6XBTMsKbogLZ;Oe_K$N0j1q70h1gd!krBe4*s|A2dl+zZ7d}AM z*lgRa=G9AXSFMPuvXw{lY@m1m* z6hKX~uk9>RbFx|@VLGH@bRjIX*({uF0}a+N)zl~H)Ntlvm2Q1{qqw|~ev`EV=w_71 z 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%0Aq{F9TVjYF| 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 literal 110105 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≶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ℜee zMUr*mO4o}!vO5#UZ$^{1bwmNp`zW6EqR_m6hnf?N#OUO{)#X7?4+011Er2Yo)YKl@ zy Date: Sat, 29 Dec 2018 14:15:22 +0100 Subject: [PATCH 011/130] Use string for extension.code instead of number "404" --- src/scraper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scraper.js b/src/scraper.js index 7b1a6ad60..d81d06690 100644 --- a/src/scraper.js +++ b/src/scraper.js @@ -105,7 +105,7 @@ const scraper = { ) if (isEmpty(output)) { - throw new ApolloError('Not found', 404) + throw new ApolloError('Not found', 'NOT_FOUND') } // fix youtube start parameter From 6461a43befcdcfbb21644990dadfcb5540e3ea24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Feb 2019 04:50:56 +0000 Subject: [PATCH 012/130] Bump got from 9.5.0 to 9.6.0 Bumps [got](https://github.com/sindresorhus/got) from 9.5.0 to 9.6.0. - [Release notes](https://github.com/sindresorhus/got/releases) - [Commits](https://github.com/sindresorhus/got/compare/v9.5.0...v9.6.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 77ea21967..bb509a161 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "@metascraper/helpers": "^4.8.5", "apollo-server": "^2.3.1", - "got": "^9.5.0", + "got": "^9.6.0", "graphql": "^14.0.2", "lodash": "^4.17.11", "metascraper": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index 3db4db7b9..fb6a48441 100644 --- a/yarn.lock +++ b/yarn.lock @@ -94,10 +94,10 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@szmarczak/http-timer@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.1.tgz#6402258dfe467532b26649ef076b4d11f74fb612" - integrity sha512-WljfOGkmSJe8SUkl+4TPvN2ec0dpUGVyfTBQLoXJUiILs+wBSc4Kvp2N3aAWE4VwwDSLGdmD3/bufS5BgZpVSQ== +"@szmarczak/http-timer@^1.1.0", "@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== dependencies: defer-to-connect "^1.0.1" @@ -648,6 +648,19 @@ cacheable-request@^5.1.0: normalize-url "^3.1.0" responselike "^1.0.2" +cacheable-request@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" + integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== + dependencies: + clone-response "^1.0.2" + get-stream "^4.0.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^1.0.1" + normalize-url "^3.1.0" + responselike "^1.0.2" + camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1475,7 +1488,24 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -got@^9.3.2, got@^9.5.0, got@~9.5.0: +got@^9.3.2, got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +got@~9.5.0: version "9.5.0" resolved "https://registry.yarnpkg.com/got/-/got-9.5.0.tgz#6fd0312c6b694c0a11d9119d95fd7daed174eb49" integrity sha512-N+4kb6i9t1lauJ4NwLVVoFVLxZNa6i+iivtNzCSVw7+bVbTXoq0qXctdd8i9rj3lrI0zDk5NGzcO4bfpEP6Uuw== From f228eb3e3c769d4a18dab38b88f9ebd2dfa30dab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 18 Mar 2019 05:00:26 +0000 Subject: [PATCH 013/130] Bump metascraper from 4.8.5 to 4.10.3 Bumps [metascraper](https://github.com/microlinkhq/metascraper) from 4.8.5 to 4.10.3. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v4.10.3) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 212 +++++++++++++++++++++------------------------------ 2 files changed, 88 insertions(+), 126 deletions(-) diff --git a/package.json b/package.json index 77ea21967..ca9fc9664 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "got": "^9.5.0", "graphql": "^14.0.2", "lodash": "^4.17.11", - "metascraper": "^4.8.5", + "metascraper": "^4.10.3", "metascraper-audio": "^4.8.5", "metascraper-author": "^4.8.5", "metascraper-clearbit-logo": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index 3db4db7b9..58eac6aa8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,24 +14,25 @@ resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz#022209e28a2b547dcde15b219f0c50f47aa5beb3" integrity sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ== -"@metascraper/helpers@^4.8.5": - version "4.8.5" - resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-4.8.5.tgz#1291fc121b543d4d7c1510a22d3b6d6780e74c64" - integrity sha512-nRkmAiYNvRUIYuXY0WrS3aRw+E+qBUTYfbP7xNjlIeAD/udWOLWr+nj0GdXe2hLUBebDK9luxpvYQ6wBQu+OZQ== +"@metascraper/helpers@^4.10.2", "@metascraper/helpers@^4.8.5": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-4.10.2.tgz#864e49c71468548441f3a1ab68fdb2913855821b" + integrity sha512-l2IyF2X4ytz5Mj/TaVenmjEhEZCCj+Qb1PnIbW10Kas/qg0O58x5hBAHsszkSWQSx/OvnDvT2Mpft77qcBa77g== dependencies: audio-extensions "0.0.0" - chrono-node "~1.3.5" + chrono-node "~1.3.11" condense-whitespace "~1.0.0" file-extension "~4.0.5" image-extensions "~1.1.0" is-relative-url "~2.0.0" + is-uri "~1.2.0" iso-639-3 "~1.1.0" isostring "0.0.1" lodash "~4.17.11" - mime-types "~2.1.21" - normalize-url "~4.1.0" + mime-types "~2.1.22" + normalize-url "~4.2.0" smartquotes "~2.3.1" - title "~3.4.0" + title "~3.4.1" truncate "~2.0.1" url-regex "~4.1.1" video-extensions "~1.1.0" @@ -440,11 +441,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -672,7 +668,7 @@ chalk@2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -chalk@^2.0.1, chalk@^2.4.1: +chalk@^2.0.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== @@ -723,12 +719,12 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -chrono-node@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.5.tgz#a2495298a32da82bcc01ad9be7d77efa5e244122" - integrity sha1-oklSmKMtqCvMAa2b59d++l4kQSI= +chrono-node@~1.3.11: + version "1.3.11" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.11.tgz#b86a26b7e3157edcc4fe3374e1b6f90caedc8e39" + integrity sha512-jDWRnY6nYvzfV3HPYBqo+tot7tcsUs9i3arGbMdI0TouPSXP2C2y/Ctp27rxKTQDi6yuTxAB2cw+Q6igGhOhdQ== dependencies: - moment "^2.10.3" + moment "2.21.0" ci-info@^1.5.0: version "1.6.0" @@ -745,11 +741,16 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^1.0.0, clean-stack@~1.3.0: +clean-stack@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= +clean-stack@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" + integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1622,7 +1623,7 @@ has@^1.0.1: dependencies: function-bind "^1.1.1" -htmlparser2@^3.10.0, htmlparser2@^3.9.1: +htmlparser2@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== @@ -1966,6 +1967,14 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-uri@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.0.tgz#b92ff234af68c0ed97d2eed46492d01793b7d420" + integrity sha1-uS/yNK9owO2X0u7UZJLQF5O31CA= + dependencies: + parse-uri "~1.0.0" + punycode2 "~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" @@ -2103,36 +2112,11 @@ latest-version@^3.0.0: dependencies: package-json "^4.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" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.escaperegexp@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" - integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.mergewith@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== - lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@~4.17.10, lodash@~4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -2315,18 +2299,17 @@ metascraper-youtube@^4.8.5: is-reachable "~3.0.0" p-locate "~3.0.0" -metascraper@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-4.8.5.tgz#5d8f5aa2190d273a3dbf7abbfb38f1e5c7201403" - integrity sha512-BcM8suZkX6j2MsSRO2O69UXJzqbG7Pr5frOYOv/6zm1qn/RmYgxElFJl9MQfbpewpIhEkFrmfRJqOxnYGPRDgQ== +metascraper@^4.10.3: + version "4.10.3" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-4.10.3.tgz#8a97ed2e914e81d1dbc1f17a5b1e64f1b804493f" + integrity sha512-wNQm5A/PIxWcahaMwI+b3rOmmXRDNmjyF6Q15dHYXEqYoGl3dFaaT4lnTTm8yntvE+fOj8+o51ON2FBdstxbsA== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^4.10.2" cheerio "~1.0.0-rc.2" cheerio-advanced-selectors "~2.0.1" lodash "~4.17.11" - p-reduce "~1.0.0" - sanitize-html "~1.20.0" - whoops "~4.0.1" + p-reduce "~2.0.0" + whoops "~4.0.2" methods@~1.1.2: version "1.1.2" @@ -2357,22 +2340,34 @@ mime-db@~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.18, mime-types@~2.1.19, mime-types@~2.1.21: +mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== + +mime-types@^2.1.12, mime-types@~2.1.18, 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.22: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + dependencies: + mime-db "~1.38.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mimic-fn@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - integrity sha1-5md4PZLonb00KBi1IwudYqZyrRg= +mimic-fn@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" + integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA== mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" @@ -2426,10 +2421,10 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -moment@^2.10.3: - version "2.23.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" - integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== +moment@2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" + integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== ms@2.0.0: version "2.0.0" @@ -2546,10 +2541,10 @@ normalize-url@^3.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -normalize-url@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.1.0.tgz#307e74c87473efa81969ad1b4bb91f1990178904" - integrity sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA== +normalize-url@~4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" + integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== npm-bundled@^1.0.1: version "1.0.5" @@ -2707,10 +2702,10 @@ p-locate@~3.0.0: dependencies: p-limit "^2.0.0" -p-reduce@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-reduce@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.0.0.tgz#365a26916213650711124881a6bdc4e32c2bfe36" + integrity sha512-VcNNEqiYIkRCGeUHELY5dUrnQHCRwL6eIH/L9oSbl/PsvyHQXD1ws/MFwuEb+6dgH/URCfROVUqOYL37eHi2kQ== p-some@^2.0.0: version "2.0.1" @@ -2741,6 +2736,11 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +parse-uri@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.0.tgz#2872dcc22f1a797acde1583d8a0ac29552ddac20" + integrity sha1-KHLcwi8aeXrN4Vg9igrClVLdrCA= + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -2803,15 +2803,6 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss@^7.0.5: - version "7.0.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.7.tgz#2754d073f77acb4ef08f1235c36c5721a7201614" - integrity sha512-HThWSJEPkupqew2fnuQMEI2YcTj/8gMV3n80cMdJsKxfIh5tHf7nM5JigNX6LxVMqo6zkgQNAI88hyFvBk41Pg== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.5.0" - prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -2877,6 +2868,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode2@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" + integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -3104,22 +3100,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-html@~1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.20.0.tgz#9a602beb1c9faf960fb31f9890f61911cc4d9156" - integrity sha512-BpxXkBoAG+uKCHjoXFmox6kCSYpnulABoGcZ/R3QyY9ndXbIM5S94eOr1IqnzTG8TnbmXaxWoDDzKC5eJv7fEQ== - dependencies: - chalk "^2.4.1" - htmlparser2 "^3.10.0" - lodash.clonedeep "^4.5.0" - lodash.escaperegexp "^4.1.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.mergewith "^4.6.1" - postcss "^7.0.5" - srcset "^1.0.0" - xtend "^4.0.1" - sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -3269,11 +3249,6 @@ source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - 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" @@ -3281,14 +3256,6 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -srcset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef" - integrity sha1-pWad4StC87HV6D7QPHEEb8SPQe8= - dependencies: - array-uniq "^1.0.2" - number-is-nan "^1.0.0" - sshpk@^1.7.0: version "1.16.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de" @@ -3410,7 +3377,7 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.2.0, supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -3447,10 +3414,10 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -title@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/title/-/title-3.4.0.tgz#17cdfae82602f87777f137047d36ec283389c9e3" - integrity sha512-gabSoHN82rROEFIkWr9GkwqTFihjdvumQflWsvwiNeIDpJbZOYrg3bXpR0SY4QcghGM1k5QrnI4k6XAiJwOWVw== +title@~3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/title/-/title-3.4.1.tgz#166177c48f52ae9b73afe9901a183f0b6c97b2e6" + integrity sha512-CoIakPr4Gi91bm4Xp6xTuZ3EENxPcKgOJzHzrhSdUatGtFMeVJa2qxI4WNhJHgz0Jak5Ck6jY2UNFM71/yBIsw== dependencies: arg "1.0.0" chalk "2.3.0" @@ -3723,13 +3690,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" -whoops@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.0.1.tgz#568d1768386fde94a27d80983bf207e453e78f20" - integrity sha512-XlSRD73wKOGE7SgOAsy6HCkcKDS6AQjjLW7egPzYOSOPU99H1QTioxobQ4cCP7a5ACjzNdd3/nxUXOn6ysijkA== +whoops@~4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/whoops/-/whoops-4.0.2.tgz#60e1281d47a1600f5f5013059afaad369d83e9d4" + integrity sha512-b1ofth7xMOAkukgzMhAPKBrgieGJAgKVMyu54DXAOVLmkhpQEfNKe4wS0R7LbdxIsm6FD2CFUjBOdN7Sj+zLSg== dependencies: - clean-stack "~1.3.0" - mimic-fn "~1.1.0" + clean-stack "~2.0.0" + mimic-fn "~2.0.0" wide-align@^1.1.0: version "1.1.3" @@ -3778,11 +3745,6 @@ xdg-basedir@^3.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= -xtend@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From d3624ab493a5a1ba9abcf914d735498550005d69 Mon Sep 17 00:00:00 2001 From: Grzegorz Leoniec Date: Mon, 17 Jun 2019 12:38:11 +0200 Subject: [PATCH 014/130] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be2a17020..82e9a4a91 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ API Service for fetching URL Information like images, icons, descriptions etc. t ## Todo`s - [x] Metascraper - [x] oEmbed -- [ ] API Cache +- [ ] Temporary API Cache in some DB? +- [ ] Scrape for meta tags - [ ] Image Caching --- From 2a81c5bfad7dae74dba195bd605bb0a9481a64a3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2019 04:24:11 +0000 Subject: [PATCH 015/130] Bump metascraper-description from 4.8.5 to 5.5.0 Bumps [metascraper-description](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 167 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 161 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 77ea21967..3b13897fe 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "metascraper-author": "^4.8.5", "metascraper-clearbit-logo": "^4.8.5", "metascraper-date": "^4.8.5", - "metascraper-description": "^4.8.5", + "metascraper-description": "^5.5.0", "metascraper-image": "^4.8.5", "metascraper-lang": "^4.8.5", "metascraper-lang-detector": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index 3db4db7b9..563b7e78b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,6 +36,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -723,6 +748,13 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== +chrono-node@~1.3.11: + version "1.3.11" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.11.tgz#b86a26b7e3157edcc4fe3374e1b6f90caedc8e39" + integrity sha512-jDWRnY6nYvzfV3HPYBqo+tot7tcsUs9i3arGbMdI0TouPSXP2C2y/Ctp27rxKTQDi6yuTxAB2cw+Q6igGhOhdQ== + dependencies: + moment "2.21.0" + chrono-node@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.3.5.tgz#a2495298a32da82bcc01ad9be7d77efa5e244122" @@ -822,6 +854,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1106,7 +1143,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1738,6 +1775,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1748,6 +1790,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1944,6 +1991,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -1966,6 +2020,14 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-uri@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-uri/-/is-uri-1.2.0.tgz#b92ff234af68c0ed97d2eed46492d01793b7d420" + integrity sha1-uS/yNK9owO2X0u7UZJLQF5O31CA= + dependencies: + parse-uri "~1.0.0" + punycode2 "~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" @@ -1991,6 +2053,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2170,6 +2237,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2187,6 +2261,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.0.tgz#b94ee9b888d26928dd9d91cab107fa04b925730b" + integrity sha512-9egM8rCo4wKiKuTwK1nFlSk39HbgluK93EgUmmboF85CVuKp7PoAwK3C8krkJeeFiH/ltExwVxcu+i2dKZYtDw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" @@ -2222,12 +2305,12 @@ metascraper-date@^4.8.5: dependencies: "@metascraper/helpers" "^4.8.5" -metascraper-description@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-4.8.5.tgz#9155b5c7f64e997f8f12209e0140e7de25614e01" - integrity sha512-0oPEiRXgAyJoQstEPgua0OZ4wD35Htf1oSMzJvejn6rYdfXaeI8RREVtsL/TsUmizyf/iKlneslnfH4/+iN42g== +metascraper-description@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.5.0.tgz#ccea262aee9513de3f9de7006256f3ff06028282" + integrity sha512-HgAm1JEE3cYbMGZFOWrAaZQp0nwVifIcYA/DQsFRBWhS47Yb5XgnRIWnxYrww6dnPwMzmveCqxpzyi94lD5+/g== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" metascraper-image@^4.8.5: version "4.8.5" @@ -2352,6 +2435,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2364,11 +2452,23 @@ mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.21: dependencies: mime-db "~1.37.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -2426,6 +2526,11 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +moment@2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" + integrity sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ== + moment@^2.10.3: version "2.23.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" @@ -2551,6 +2656,11 @@ normalize-url@~4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.1.0.tgz#307e74c87473efa81969ad1b4bb91f1990178904" integrity sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2688,11 +2798,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -2741,6 +2861,11 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +parse-uri@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-uri/-/parse-uri-1.0.0.tgz#2872dcc22f1a797acde1583d8a0ac29552ddac20" + integrity sha1-KHLcwi8aeXrN4Vg9igrClVLdrCA= + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -2877,6 +3002,11 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +punycode2@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" + integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -3457,12 +3587,22 @@ title@~3.4.0: clipboardy "1.2.2" titleize "1.0.0" +title@~3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/title/-/title-3.4.1.tgz#166177c48f52ae9b73afe9901a183f0b6c97b2e6" + integrity sha512-CoIakPr4Gi91bm4Xp6xTuZ3EENxPcKgOJzHzrhSdUatGtFMeVJa2qxI4WNhJHgz0Jak5Ck6jY2UNFM71/yBIsw== + dependencies: + arg "1.0.0" + chalk "2.3.0" + clipboardy "1.2.2" + titleize "1.0.0" + titleize@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3544,6 +3684,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3669,6 +3814,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From 4ceff96df9a206a8763e53d769be36ad8eedaf98 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:55:48 +0000 Subject: [PATCH 016/130] Bump metascraper-clearbit-logo from 4.8.5 to 5.3.0 Bumps [metascraper-clearbit-logo](https://github.com/microlinkhq/metascraper-clearbit-logo) from 4.8.5 to 5.3.0. - [Release notes](https://github.com/microlinkhq/metascraper-clearbit-logo/releases) - [Commits](https://github.com/microlinkhq/metascraper-clearbit-logo/commits) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 2028fc435..e271f5df1 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "metascraper": "^4.10.3", "metascraper-audio": "^4.8.5", "metascraper-author": "^4.8.5", - "metascraper-clearbit-logo": "^4.8.5", + "metascraper-clearbit-logo": "^5.3.0", "metascraper-date": "^4.8.5", "metascraper-description": "^4.8.5", "metascraper-image": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index f70892040..0d1ee8ad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1489,7 +1489,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -got@^9.3.2, got@^9.6.0: +got@^9.3.2, got@^9.6.0, got@~9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== @@ -2221,13 +2221,12 @@ metascraper-author@^4.8.5: "@metascraper/helpers" "^4.8.5" lodash "~4.17.10" -metascraper-clearbit-logo@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-clearbit-logo/-/metascraper-clearbit-logo-4.8.5.tgz#d1e672f1804f7edce507317eb6aeb94a88f29529" - integrity sha512-D53DO9gQFwDqgq6r0qbV92YFpLZTW3Zck17WmlkmPbl9wDLH8EOP5AC0S4h9hu40qwqR2gSqIaH298iQJ+gYvA== +metascraper-clearbit-logo@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/metascraper-clearbit-logo/-/metascraper-clearbit-logo-5.3.0.tgz#e4596dbaf35503635d585a705f4119c7eddc6773" + integrity sha512-Vg9m8cj2yEIUDrRjvCORvf8vgq2HLsWLVqNnIactNUPJ+Lcly5Xcxh5TcmHYp5Qx5DtNUCoKlakomYHn8mOjqg== dependencies: - got "~9.5.0" - qsm "~2.1.0" + got "~9.6.0" metascraper-date@^4.8.5: version "4.8.5" @@ -2918,11 +2917,6 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qsm@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/qsm/-/qsm-2.1.0.tgz#53c5d28424e2900e1b83d8e958bc916552322516" - integrity sha512-v+5GHA5DkXpqHGXnrZMqft2I2esvq7BJTm+EKN3L+BFzKcx/JwmazJzrebOjuOzYrJreT+JS13K78TReKkI17Q== - querystringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" From 69b1a2587cd6cc7ed00116a7173c77f6238c036a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:03 +0000 Subject: [PATCH 017/130] Bump metascraper-video from 4.8.5 to 5.5.0 Bumps [metascraper-video](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 2028fc435..965aa5391 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "metascraper-soundcloud": "^4.8.5", "metascraper-title": "^4.8.5", "metascraper-url": "^4.8.5", - "metascraper-video": "^4.8.5", + "metascraper-video": "^5.5.0", "metascraper-youtube": "^4.8.5", "request": "^2.88.0", "request-promise-native": "^1.0.5" diff --git a/yarn.lock b/yarn.lock index f70892040..c31657455 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -836,6 +861,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1120,7 +1150,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1769,6 +1799,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1779,6 +1814,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1975,6 +2015,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2030,6 +2077,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2184,6 +2236,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2201,6 +2260,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" @@ -2311,12 +2379,12 @@ metascraper-url@^4.8.5: dependencies: "@metascraper/helpers" "^4.8.5" -metascraper-video@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-4.8.5.tgz#d70129ea04889ce9dfcd4216ea71757b4ea1390b" - integrity sha512-EWWcaFYUChHoA2Q9dbALTHB0sETRlDaendGDCXrJo2fQHlBiO/iioCiuUvTJg1UDCF1hFlNWxsBqSBxO9d2wvA== +metascraper-video@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.5.0.tgz#b12995c4d235cb9dd92cb87e43ba3bdbc945b56d" + integrity sha512-FOqnOCRB7Y2xfSu9Apag2kdL4kjbN2J68UQd9+E65pFtel4xHbPfJ16/+CTJyX7svzIc90zr9+1n4hHGiI1dkg== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" lodash "~4.17.11" metascraper-youtube@^4.8.5: @@ -2365,6 +2433,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2389,11 +2462,23 @@ mime-types@~2.1.22: dependencies: mime-db "~1.38.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" @@ -2576,6 +2661,11 @@ normalize-url@~4.2.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2713,11 +2803,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -3459,7 +3559,7 @@ titleize@1.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3541,6 +3641,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3666,6 +3771,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From b7ef87e24e00497af1ec5fafb85b24ae21efc3ca Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:04 +0000 Subject: [PATCH 018/130] Bump metascraper-logo from 4.8.5 to 5.5.0 Bumps [metascraper-logo](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 2028fc435..b29f7483e 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "metascraper-image": "^4.8.5", "metascraper-lang": "^4.8.5", "metascraper-lang-detector": "^4.8.5", - "metascraper-logo": "^4.8.5", + "metascraper-logo": "^5.5.0", "metascraper-logo-favicon": "^4.8.5", "metascraper-publisher": "^4.8.5", "metascraper-soundcloud": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index f70892040..f36fd5d89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -836,6 +861,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1120,7 +1150,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1769,6 +1799,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1779,6 +1814,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1975,6 +2015,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2030,6 +2077,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2184,6 +2236,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2201,6 +2260,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" @@ -2275,12 +2343,12 @@ metascraper-logo-favicon@^4.8.5: got "~9.5.0" lodash "~4.17.11" -metascraper-logo@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-4.8.5.tgz#45cb44618e41a5b69c9da8fb28ae4061281b2033" - integrity sha512-fu6Ff9niFt+2HdZgaAI3B5LOIf5BTXA80sE2p+9iW4w3BH15r6N+N42COmVtjHAyJSxYpEWzlF0E3+hnR9qp1g== +metascraper-logo@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.5.0.tgz#3c69bfe6e12c09501193aefc195cfb8e00f6580c" + integrity sha512-MnnJX4zUouaRv7NBJPiEwOMWgHTp/50GgDJzAsR6HHnxHGh0jRSx6vg1zb8QotNFhWu4ev68so39IXCYVD3aHA== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" metascraper-publisher@^4.8.5: version "4.8.5" @@ -2365,6 +2433,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2389,11 +2462,23 @@ mime-types@~2.1.22: dependencies: mime-db "~1.38.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" @@ -2576,6 +2661,11 @@ normalize-url@~4.2.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2713,11 +2803,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -3459,7 +3559,7 @@ titleize@1.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3541,6 +3641,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3666,6 +3771,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From d1efdad55e8bef3d96f1d2737ff9778a5df6b9c6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:08 +0000 Subject: [PATCH 019/130] Bump metascraper-description from 4.8.5 to 5.5.0 Bumps [metascraper-description](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 2028fc435..d16bf64f3 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "metascraper-author": "^4.8.5", "metascraper-clearbit-logo": "^4.8.5", "metascraper-date": "^4.8.5", - "metascraper-description": "^4.8.5", + "metascraper-description": "^5.5.0", "metascraper-image": "^4.8.5", "metascraper-lang": "^4.8.5", "metascraper-lang-detector": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index f70892040..f851a7c7c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -836,6 +861,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1120,7 +1150,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1769,6 +1799,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1779,6 +1814,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1975,6 +2015,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2030,6 +2077,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2184,6 +2236,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2201,6 +2260,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" @@ -2236,12 +2304,12 @@ metascraper-date@^4.8.5: dependencies: "@metascraper/helpers" "^4.8.5" -metascraper-description@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-4.8.5.tgz#9155b5c7f64e997f8f12209e0140e7de25614e01" - integrity sha512-0oPEiRXgAyJoQstEPgua0OZ4wD35Htf1oSMzJvejn6rYdfXaeI8RREVtsL/TsUmizyf/iKlneslnfH4/+iN42g== +metascraper-description@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.5.0.tgz#ccea262aee9513de3f9de7006256f3ff06028282" + integrity sha512-HgAm1JEE3cYbMGZFOWrAaZQp0nwVifIcYA/DQsFRBWhS47Yb5XgnRIWnxYrww6dnPwMzmveCqxpzyi94lD5+/g== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" metascraper-image@^4.8.5: version "4.8.5" @@ -2365,6 +2433,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2389,11 +2462,23 @@ mime-types@~2.1.22: dependencies: mime-db "~1.38.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" @@ -2576,6 +2661,11 @@ normalize-url@~4.2.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2713,11 +2803,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -3459,7 +3559,7 @@ titleize@1.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3541,6 +3641,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3666,6 +3771,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From 82dcc99b6c9e6dd6de93e8f3d5b5cb83afd8561c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:08 +0000 Subject: [PATCH 020/130] Bump metascraper-audio from 4.8.5 to 5.5.0 Bumps [metascraper-audio](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 2028fc435..1715834f1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "graphql": "^14.0.2", "lodash": "^4.17.11", "metascraper": "^4.10.3", - "metascraper-audio": "^4.8.5", + "metascraper-audio": "^5.5.0", "metascraper-author": "^4.8.5", "metascraper-clearbit-logo": "^4.8.5", "metascraper-date": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index f70892040..5017882aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -836,6 +861,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1120,7 +1150,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1769,6 +1799,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1779,6 +1814,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1975,6 +2015,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2030,6 +2077,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2184,6 +2236,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2201,17 +2260,26 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -metascraper-audio@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-4.8.5.tgz#1738fdac2f5731f5172edca233834b087c9f4c29" - integrity sha512-GuoYuE/+fEkKYOsd658iYlRo2XOWqxKKZM6yMPKnpSOXWJSySZWhfmPoFkz40tadwfBWx01nKnIwwopmiZFXEQ== +metascraper-audio@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.5.0.tgz#e8515b25964555271270049356795f1d5f48aeef" + integrity sha512-gsSwLbHUzqZNPro+ld2fr9xzUKn5cp1pG428paacnrUnEPlisLiyWBFUkEwgSQR91vKSYsdn9ZUPwTS2GWDTcA== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" metascraper-author@^4.8.5: version "4.8.5" @@ -2365,6 +2433,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2389,11 +2462,23 @@ mime-types@~2.1.22: dependencies: mime-db "~1.38.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" @@ -2576,6 +2661,11 @@ normalize-url@~4.2.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2713,11 +2803,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -3459,7 +3559,7 @@ titleize@1.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3541,6 +3641,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3666,6 +3771,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From af8ed1c007467243f4bd73f1456cc8d73ac0f585 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:08 +0000 Subject: [PATCH 021/130] Bump apollo-server from 2.3.1 to 2.6.7 Bumps [apollo-server](https://github.com/apollographql/apollo-server) from 2.3.1 to 2.6.7. - [Release notes](https://github.com/apollographql/apollo-server/releases) - [Changelog](https://github.com/apollographql/apollo-server/blob/master/CHANGELOG.md) - [Commits](https://github.com/apollographql/apollo-server/compare/apollo-server@2.3.1...apollo-server@2.6.7) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 256 +++++++++++++++++++++++++++------------------------ 2 files changed, 139 insertions(+), 119 deletions(-) diff --git a/package.json b/package.json index 2028fc435..39b157213 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "homepage": "https://github.com/Human-Connection/Nitro-Embed#readme", "dependencies": { "@metascraper/helpers": "^4.8.5", - "apollo-server": "^2.3.1", + "apollo-server": "^2.6.7", "got": "^9.6.0", "graphql": "^14.0.2", "lodash": "^4.17.11", diff --git a/yarn.lock b/yarn.lock index f70892040..a05c9261d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,17 +2,17 @@ # yarn lockfile v1 -"@apollographql/apollo-tools@^0.2.6": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.2.9.tgz#1e20999d11728ef47f8f812f2be0426b5dde1a51" - integrity sha512-AEIQwPkS0QLbkpb6WyRhV4aOMxuErasp47ABv5niDKOasQH8mrD8JSGKJAHuQxVe4kB8DE9sLRoc5qeQ0KFCHA== +"@apollographql/apollo-tools@^0.3.6": + version "0.3.7" + resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.3.7.tgz#3bc9c35b9fff65febd4ddc0c1fc04677693a3d40" + integrity sha512-+ertvzAwzkYmuUtT8zH3Zi6jPdyxZwOgnYaZHY7iLnMVJDhQKWlkyjLMF8wyzlPiEdDImVUMm5lOIBZo7LkGlg== dependencies: - apollo-env "0.2.5" + apollo-env "0.5.1" -"@apollographql/graphql-playground-html@^1.6.6": - version "1.6.6" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.6.tgz#022209e28a2b547dcde15b219f0c50f47aa5beb3" - integrity sha512-lqK94b+caNtmKFs5oUVXlSpN3sm5IXZ+KfhMxOtr0LR2SqErzkoJilitjDvJ1WbjHlxLI7WtCjRmOLdOGJqtMQ== +"@apollographql/graphql-playground-html@1.6.20": + version "1.6.20" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.20.tgz#bf9f2acdf319c0959fad8ec1239741dd2ead4e8d" + integrity sha512-3LWZa80HcP70Pl+H4KhLDJ7S0px+9/c8GTXdl6SpunRecUaB27g/oOQnAjNHLHdbWuGE0uyqcuGiTfbKB3ilaQ== "@metascraper/helpers@^4.10.2", "@metascraper/helpers@^4.8.5": version "4.10.2" @@ -145,7 +145,7 @@ "@types/node" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@4.16.0": +"@types/express@*": version "4.16.0" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" integrity sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w== @@ -154,6 +154,15 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" +"@types/express@4.17.0": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.0.tgz#49eaedb209582a86f12ed9b725160f12d04ef287" + integrity sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + "@types/long@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" @@ -253,47 +262,57 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -apollo-cache-control@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.4.0.tgz#fec343e6ec95aa4f1b88e07e62f067bee0c48397" - integrity sha512-WuriaNQIugTE8gYwfBWWCbbQTSKul/cV4JMi5UgqNIUvjHvnKZQLKbt5uYWow6QQNMkLT9hey8QPYkWpogkeSA== +apollo-cache-control@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.7.4.tgz#0cb5c7be0e0dd0c44b1257144cd7f9f2a3c374e6" + integrity sha512-TVACHwcEF4wfHo5H9FLnoNjo0SLDo2jPW+bXs9aw0Y4Z2UisskSAPnIYOqUPnU8SoeNvs7zWgbLizq11SRTJtg== dependencies: - apollo-server-env "2.2.0" - graphql-extensions "0.4.0" + apollo-server-env "2.4.0" + graphql-extensions "0.7.4" -apollo-datasource@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.2.1.tgz#3ecef4efe64f7a04a43862f32027d38ac09e142c" - integrity sha512-r185+JTa5KuF1INeTAk7AEP76zwMN6c8Ph1lmpzJMNwBUEzTGnLClrccCskCBx4SxfnkdKbuQdwn9JwCJUWrdg== +apollo-datasource@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.5.0.tgz#7a8c97e23da7b9c15cb65103d63178ab19eca5e9" + integrity sha512-SVXxJyKlWguuDjxkY/WGlC/ykdsTmPxSF0z8FenagcQ91aPURXzXP1ZDz5PbamY+0iiCRubazkxtTQw4GWTFPg== dependencies: - apollo-server-caching "0.2.1" - apollo-server-env "2.2.0" + apollo-server-caching "0.4.0" + apollo-server-env "2.4.0" -apollo-engine-reporting-protobuf@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.2.0.tgz#2aaf4d2eddefe7924d469cf1135267bc0deadf73" - integrity sha512-qI+GJKN78UMJ9Aq/ORdiM2qymZ5yswem+/VDdVFocq+/e1QqxjnpKjQWISkswci5+WtpJl9SpHBNxG98uHDKkA== +apollo-engine-reporting-protobuf@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.3.1.tgz#a581257fa8e3bb115ce38bf1b22e052d1475ad69" + integrity sha512-Ui3nPG6BSZF8BEqxFs6EkX6mj2OnFLMejxEHSOdM82bakyeouCGd7J0fiy8AD6liJoIyc4X7XfH4ZGGMvMh11A== dependencies: protobufjs "^6.8.6" -apollo-engine-reporting@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-0.2.0.tgz#e71816b1f46e782f8538c5a118148d4c0e628e25" - integrity sha512-Q6FfVb10v/nrv8FaFsPjIYlWh62jaYav3LuMgM9PsHWGK/zRQFXOEwLxcY2UCvG7O1moxF3XGmfBhMgo54py+Q== +apollo-engine-reporting@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.3.5.tgz#075424d39dfe77a20f96e8e33b7ae52d58c38e1e" + integrity sha512-pSwjPgXK/elFsR22LXALtT3jI4fpEpeTNTHgNwLVLohaolusMYgBc/9FnVyFWFfMFS9k+3RmfeQdHhZ6T7WKFQ== dependencies: - apollo-engine-reporting-protobuf "0.2.0" - apollo-server-env "2.2.0" + apollo-engine-reporting-protobuf "0.3.1" + apollo-graphql "^0.3.3" + apollo-server-core "2.6.7" + apollo-server-env "2.4.0" async-retry "^1.2.1" - graphql-extensions "0.4.0" - lodash "^4.17.10" + graphql-extensions "0.7.6" -apollo-env@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.2.5.tgz#162c785bccd2aea69350a7600fab4b7147fc9da5" - integrity sha512-Gc7TEbwCl7jJVutnn8TWfzNSkrrqyoo0DP92BQJFU9pZbJhpidoXf2Sw1YwOJl82rRKH3ujM3C8vdZLOgpFcFA== +apollo-env@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/apollo-env/-/apollo-env-0.5.1.tgz#b9b0195c16feadf0fe9fd5563edb0b9b7d9e97d3" + integrity sha512-fndST2xojgSdH02k5hxk1cbqA9Ti8RX4YzzBoAB4oIe1Puhq7+YlhXGXfXB5Y4XN0al8dLg+5nAkyjNAR2qZTw== dependencies: - core-js "^3.0.0-beta.3" + core-js "^3.0.1" node-fetch "^2.2.0" + sha.js "^2.4.11" + +apollo-graphql@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.3.3.tgz#ce1df194f6e547ad3ce1e35b42f9c211766e1658" + integrity sha512-t3CO/xIDVsCG2qOvx2MEbuu4b/6LzQjcBBwiVnxclmmFyAxYCIe7rpPlnLHSq7HyOMlCWDMozjoeWfdqYSaLqQ== + dependencies: + apollo-env "0.5.1" + lodash.sortby "^4.7.0" apollo-link@^1.2.3: version "1.2.6" @@ -303,93 +322,93 @@ apollo-link@^1.2.3: apollo-utilities "^1.0.0" zen-observable-ts "^0.8.13" -apollo-server-caching@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.2.1.tgz#7e67f8c8cac829e622b394f0fb82579cabbeadfd" - integrity sha512-+U9F3X297LL8Gqy6ypfDNEv/DfV/tDht9Dr2z3AMaEkNW1bwO6rmdDL01zYxDuVDVq6Z3qSiNCSO2pXE2F0zmA== +apollo-server-caching@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.4.0.tgz#e82917590d723c0adc1fa52900e79e93ad65e4d9" + integrity sha512-GTOZdbLhrSOKYNWMYgaqX5cVNSMT0bGUTZKV8/tYlyYmsB6ey7l6iId3Q7UpHS6F6OR2lstz5XaKZ+T3fDfPzQ== dependencies: lru-cache "^5.0.0" -apollo-server-core@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.3.1.tgz#cbdc0020a0dfecf2220cf5062dbb304fdf56edf2" - integrity sha512-8jMWYOQIZi9mDJlHe2rXg8Cp4xKYogeRu23jkcNy+k5UjZL+eO+kHXbNFiTaP4HLYYEpe2XE3asxp6q5YUEQeQ== +apollo-server-core@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.7.tgz#85b0310f40cfec43a702569c73af16d88776a6f0" + integrity sha512-HfOGLvEwPgDWTvd3ZKRPEkEnICKb7xadn1Mci4+auMTsL/NVkfpjPa8cdzubi/kS2/MvioIn7Bg74gmiSLghGQ== dependencies: - "@apollographql/apollo-tools" "^0.2.6" - "@apollographql/graphql-playground-html" "^1.6.6" + "@apollographql/apollo-tools" "^0.3.6" + "@apollographql/graphql-playground-html" "1.6.20" "@types/ws" "^6.0.0" - apollo-cache-control "0.4.0" - apollo-datasource "0.2.1" - apollo-engine-reporting "0.2.0" - apollo-server-caching "0.2.1" - apollo-server-env "2.2.0" - apollo-server-errors "2.2.0" - apollo-server-plugin-base "0.2.1" - apollo-tracing "0.4.0" - graphql-extensions "0.4.1" + apollo-cache-control "0.7.4" + apollo-datasource "0.5.0" + apollo-engine-reporting "1.3.5" + apollo-server-caching "0.4.0" + apollo-server-env "2.4.0" + apollo-server-errors "2.3.0" + apollo-server-plugin-base "0.5.6" + apollo-tracing "0.7.3" + fast-json-stable-stringify "^2.0.0" + graphql-extensions "0.7.6" graphql-subscriptions "^1.0.0" graphql-tag "^2.9.2" graphql-tools "^4.0.0" graphql-upload "^8.0.2" - json-stable-stringify "^1.0.1" - lodash "^4.17.10" + sha.js "^2.4.11" subscriptions-transport-ws "^0.9.11" ws "^6.0.0" -apollo-server-env@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.2.0.tgz#5eec5dbf46581f663fd6692b2e05c7e8ae6d6034" - integrity sha512-wjJiI5nQWPBpNmpiLP389Ezpstp71szS6DHAeTgYLb/ulCw3CTuuA+0/E1bsThVWiQaDeHZE0sE3yI8q2zrYiA== +apollo-server-env@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-2.4.0.tgz#6611556c6b627a1636eed31317d4f7ea30705872" + integrity sha512-7ispR68lv92viFeu5zsRUVGP+oxsVI3WeeBNniM22Cx619maBUwcYTIC3+Y3LpXILhLZCzA1FASZwusgSlyN9w== dependencies: node-fetch "^2.1.2" util.promisify "^1.0.0" -apollo-server-errors@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.2.0.tgz#5b452a1d6ff76440eb0f127511dc58031a8f3cb5" - integrity sha512-gV9EZG2tovFtT1cLuCTavnJu2DaKxnXPRNGSTo+SDI6IAk6cdzyW0Gje5N2+3LybI0Wq5KAbW6VLei31S4MWmg== +apollo-server-errors@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.0.tgz#700622b66a16dffcad3b017e4796749814edc061" + integrity sha512-rUvzwMo2ZQgzzPh2kcJyfbRSfVKRMhfIlhY7BzUfM4x6ZT0aijlgsf714Ll3Mbf5Fxii32kD0A/DmKsTecpccw== -apollo-server-express@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.3.1.tgz#0598e2fa0a0d9e6eb570c0bb6ce65c31810a9c09" - integrity sha512-J+rObr4GdT/5j6qTByUJoSvZSjTAX/7VqIkr2t+GxwcVUFGet2MdOHuV6rtWKc8CRgvVKfKN6iBrb2EOFcp2LQ== +apollo-server-express@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.7.tgz#22307e08b75be1553f4099d00028abe52597767d" + integrity sha512-qbCQM+8LxXpwPNN5Sdvcb+Sne8zuCORFt25HJtPJRkHlyBUzOd7JA7SEnUn5e2geTiiGoVIU5leh+++C51udTw== dependencies: - "@apollographql/graphql-playground-html" "^1.6.6" + "@apollographql/graphql-playground-html" "1.6.20" "@types/accepts" "^1.3.5" "@types/body-parser" "1.17.0" "@types/cors" "^2.8.4" - "@types/express" "4.16.0" + "@types/express" "4.17.0" accepts "^1.3.5" - apollo-server-core "2.3.1" + apollo-server-core "2.6.7" body-parser "^1.18.3" cors "^2.8.4" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" type-is "^1.6.16" -apollo-server-plugin-base@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.2.1.tgz#d08c9576f7f11ab6e212f352d482faaa4059a31e" - integrity sha512-497NIY9VWRYCrMSkgR11IrIUO4Fsy6aGgnpOJoTdLQAnkDD9SJDSRzwKj4gypUoTT2unfKDng4eMxXVZlHvjOw== +apollo-server-plugin-base@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.6.tgz#3a7128437a0f845e7d873fa43ef091ff7bf27975" + integrity sha512-wJvcPqfm/kiBwY5JZT85t2A4pcHv24xdQIpWMNt1zsnx77lIZqJmhsc22eSUSrlnYqUMXC4XMVgSUfAO4oI9wg== -apollo-server@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.3.1.tgz#4d2b6bbb48b44d86076680304705b8b7ae952d37" - integrity sha512-+S+/BhLJF9Ms99OK9HpC4P6rcVWTobWWKeLSVdgxqG487i/kwMrCAw/ICrDVJGeOGJRi6PndVu9XdHWHuX1lvQ== +apollo-server@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.7.tgz#b707ede529b4d45f2f00a74f3b457658b0e62e83" + integrity sha512-4wk9JykURLed6CnNIj9jhU6ueeTVmGBTyAnnvnlhRrOf50JAFszUErZIKg6lw5vVr5riaByrGFIkMBTySCHgPQ== dependencies: - apollo-server-core "2.3.1" - apollo-server-express "2.3.1" + apollo-server-core "2.6.7" + apollo-server-express "2.6.7" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" -apollo-tracing@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.4.0.tgz#4b939063f4292422ac5a3564b76d1d88dec0a916" - integrity sha512-BlM8iQUQva4fm0xD/pLwkcz0degfB9a/aAn4k4cK36eLVD8XUkl7ptEB0c+cwcj7tOYpV1r5QX1XwdayBzlHSg== +apollo-tracing@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.7.3.tgz#8533e3e2dca2d5a25e8439ce498ea33ff4d159ee" + integrity sha512-H6fSC+awQGnfDyYdGIB0UQUhcUC3n5Vy+ujacJ0bY6R+vwWeZOQvu7wRHNjk/rbOSTLCo9A0OcVX7huRyu9SZg== dependencies: - apollo-server-env "2.2.0" - graphql-extensions "0.4.0" + apollo-server-env "2.4.0" + graphql-extensions "0.7.4" apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: version "1.0.27" @@ -878,10 +897,10 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^3.0.0-beta.3: - version "3.0.0-beta.6" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0-beta.6.tgz#f1ee6c8bd9c1941f992fda01f886b3b40ceb1510" - integrity sha512-06k0SnRTdYGlTNek5vAqfxbQjTtMM0zC2xJ79T1QM5UkZS0JQegrOgDiGh43n1QICnOe5+bcvS0zOGTm2C7rBA== +core-js@^3.0.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07" + integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1528,19 +1547,19 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graphql-extensions@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.0.tgz#5857c7b7b9f20dbccbfd88730fffa5963b3c61ee" - integrity sha512-8TUgIIUVpXWOcqq9RdmTSHUrhc3a/s+saKv9cCl8TYWHK9vyJIdea7ZaSKHGDthZNcsN+C3LulZYRL3Ah8ukoA== +graphql-extensions@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.4.tgz#78327712822281d5778b9210a55dc59c93a9c184" + integrity sha512-Ly+DiTDU+UtlfPGQkqmBX2SWMr9OT3JxMRwpB9K86rDNDBTJtG6AE2kliQKKE+hg1+945KAimO7Ep+YAvS7ywg== dependencies: - "@apollographql/apollo-tools" "^0.2.6" + "@apollographql/apollo-tools" "^0.3.6" -graphql-extensions@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.4.1.tgz#92c49a8409ffbfb24559d7661ab60cc90d6086e4" - integrity sha512-Xei4rBxbsTHU6dYiq9y1xxbpRMU3+Os7yD3vXV5W4HbTaxRMizDmu6LAvV4oBEi0ttwICHARQjYTjDTDhHnxrQ== +graphql-extensions@0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.7.6.tgz#80cdddf08b0af12525529d1922ee2ea0d0cc8ecf" + integrity sha512-RV00O3YFD1diehvdja180BlKOGWgeigr/8/Wzr6lXwLcFtk6FecQC/7nf6oW1qhuXczHyNjt/uCr0WWbWq6mYg== dependencies: - "@apollographql/apollo-tools" "^0.2.6" + "@apollographql/apollo-tools" "^0.3.6" graphql-subscriptions@^1.0.0: version "1.0.0" @@ -2077,23 +2096,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - 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= -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -2147,7 +2154,12 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@~4.17.10, lodash@~4.17.11: +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.11, lodash@~4.17.10, lodash@~4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -3206,6 +3218,14 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" From b8725f1591e7c214e65659dd328403b0570c505e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:56:09 +0000 Subject: [PATCH 022/130] Bump metascraper-url from 4.8.5 to 5.5.0 Bumps [metascraper-url](https://github.com/microlinkhq/metascraper) from 4.8.5 to 5.5.0. - [Release notes](https://github.com/microlinkhq/metascraper/releases) - [Changelog](https://github.com/microlinkhq/metascraper/blob/master/CHANGELOG.md) - [Commits](https://github.com/microlinkhq/metascraper/compare/v4.8.5...v5.5.0) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 127 ++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 2028fc435..e4fbe7e47 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "metascraper-publisher": "^4.8.5", "metascraper-soundcloud": "^4.8.5", "metascraper-title": "^4.8.5", - "metascraper-url": "^4.8.5", + "metascraper-url": "^5.5.0", "metascraper-video": "^4.8.5", "metascraper-youtube": "^4.8.5", "request": "^2.88.0", diff --git a/yarn.lock b/yarn.lock index f70892040..25b617619 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,31 @@ url-regex "~4.1.1" video-extensions "~1.1.0" +"@metascraper/helpers@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.5.0.tgz#38033895e404f3913791047b85b457ee84804880" + integrity sha512-VdWKWxcYVd3uzPNxr4Aucl+LSmvLzwgrvF+EIX6pNN+n66mMjimnVSTENQaWo7/aYOxF7IPyC9aBlIq9C1JDXA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~1.1.2" + file-extension "~4.0.5" + image-extensions "~1.1.0" + is-relative-url "~3.0.0" + is-uri "~1.2.0" + iso-639-3 "~1.2.0" + isostring "0.0.1" + lodash "~4.17.11" + mem "~5.1.0" + mime-types "~2.1.24" + normalize-url "~4.3.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.1.0" + url-regex "~5.0.0" + video-extensions "~1.1.0" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -836,6 +861,11 @@ condense-whitespace@~1.0.0: resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-1.0.0.tgz#8376d98ef028e6cb2cd2468e28ce42c5c65ab1a9" integrity sha1-g3bZjvAo5sss0kaOKM5CxcZasak= +condense-whitespace@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/condense-whitespace/-/condense-whitespace-2.0.0.tgz#94e9644938f66aa7be4b8849f8f0b3cec97d6b3a" + integrity sha512-Ath9o58/0rxZXbyoy3zZgrVMoIemi30sukG/btuMKCLyqfQt3dNOWc9N3EHEMa2Q3i0tXQPDJluYFLwy7pJuQw== + configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -1120,7 +1150,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1, entities@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1769,6 +1799,11 @@ ip-regex@^1.0.1: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0= +ip-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.1.0.tgz#5ad62f685a14edb421abebc2fff8db94df67b455" + integrity sha512-pKnZpbgCTfH/1NLIlOduP/V+WRXzC2MOz3Qo8xmxk8C5GudJLgK5QyLVXOSWy3ParAH7Eemurl3xjv/WXYFvMA== + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" @@ -1779,6 +1814,11 @@ is-absolute-url@^2.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913" + integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -1975,6 +2015,13 @@ is-relative-url@~2.0.0: dependencies: is-absolute-url "^2.0.0" +is-relative-url@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-3.0.0.tgz#f623c8e26baa5bd3742b3b7ec074f50f3b45b3f3" + integrity sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA== + dependencies: + is-absolute-url "^3.0.0" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -2030,6 +2077,11 @@ iso-639-3@~1.1.0: resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.1.0.tgz#83722daf55490a707c318ae18a33ba3bab06c843" integrity sha512-l3BAnxNpyRIZA4mEzI2md/YVrxQ3hI8hiQe7TFyQknjyOh8vCzobZuAXTFHELco0FBkYRx4FkAlIqkKrHhnzgw== +iso-639-3@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-1.2.0.tgz#eee1f5e6ca2bbb33e3ecc910857c1c12e8b295be" + integrity sha512-jNvD2P4JHNckQH7pc0R0SQ4oPCpyEtgs0nTtjB+DZCUDdygz0cOAxlcnq5KgNjjsqMHbR4Sbgwz2+DflzAZvlQ== + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2184,6 +2236,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + 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" @@ -2201,6 +2260,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3" + integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^2.1.0" + p-is-promise "^2.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" @@ -2304,12 +2372,12 @@ metascraper-title@^4.8.5: "@metascraper/helpers" "^4.8.5" lodash "~4.17.10" -metascraper-url@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-4.8.5.tgz#37fe18af596da0e0b999a85dce1b30b6d8adb4fb" - integrity sha512-hmAzyQnRTjYrgb9UI6eEbPoiTqbEl0tUOHDKBNy27lMUxcozvJo16SEUUJKdgyMD2QNXGbmnnze8YyK+nVgaBA== +metascraper-url@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.5.0.tgz#c2d98cfa3512121c7c662e35a859d8d4dda06c79" + integrity sha512-niQQENVT6J6HpLZjgjqY7AHwnyGAKiDUbHUiFTVgXRXxXxRNEBSF9QEk4y0dylM48aNdrlKrjn5P/1HLWzs2NA== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" metascraper-video@^4.8.5: version "4.8.5" @@ -2365,6 +2433,11 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -2389,11 +2462,23 @@ mime-types@~2.1.22: dependencies: mime-db "~1.38.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde" @@ -2576,6 +2661,11 @@ normalize-url@~4.2.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.2.0.tgz#e747f16b58e6d7f391495fd86415fa04ec7c9897" integrity sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg== +normalize-url@~4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.3.0.tgz#9c49e10fc1876aeb76dba88bf1b2b5d9fa57b2ee" + integrity sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2713,11 +2803,21 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.0.0.tgz#07e9c6d22c31f9c6784cb4f1e1454a79b6d9e2d6" integrity sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA== +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" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" @@ -3459,7 +3559,7 @@ titleize@1.0.0: resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" integrity sha1-fTUHIgYYMLpmF2MeDP0+oIOY2Vo= -tlds@^1.187.0: +tlds@^1.187.0, tlds@^1.203.0: version "1.203.1" resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== @@ -3541,6 +3641,11 @@ truncate@~2.0.1: resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.0.1.tgz#dd1a6d15630515663d8475f6f24edf2f800ebb1b" integrity sha1-3RptFWMFFWY9hHX28k7fL4AOuxs= +truncate@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/truncate/-/truncate-2.1.0.tgz#391183563a25cffbd4d613a1d00ae5844c9e55d3" + integrity sha512-em3E3SUDONOjTBcZ36DTm3RvDded3IRU9rX32oHwwXNt3rJD5MVaFlJTQvs8tJoHRoeYP36OuQ1eL/Q7bNEWIQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -3666,6 +3771,14 @@ url-regex@~4.1.1: ip-regex "^1.0.1" tlds "^1.187.0" +url-regex@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-5.0.0.tgz#8f5456ab83d898d18b2f91753a702649b873273a" + integrity sha512-O08GjTiAFNsSlrUWfqF1jH0H1W3m35ZyadHrGv5krdnmPPoxP27oDTqux/579PtaroiSGm5yma6KT1mHFH6Y/g== + dependencies: + ip-regex "^4.1.0" + tlds "^1.203.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From 721c75eeeaf015a1309ca82fc3363d32e580bbfa Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2019 19:58:37 +0000 Subject: [PATCH 023/130] Bump metascraper-soundcloud from 4.8.5 to 5.5.3 Bumps [metascraper-soundcloud](https://github.com/microlinkhq/metascraper-soundcloud) from 4.8.5 to 5.5.3. - [Release notes](https://github.com/microlinkhq/metascraper-soundcloud/releases) - [Commits](https://github.com/microlinkhq/metascraper-soundcloud/commits) Signed-off-by: dependabot-preview[bot] --- package.json | 2 +- yarn.lock | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5922490cf..7ccba186e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "metascraper-logo": "^4.8.5", "metascraper-logo-favicon": "^4.8.5", "metascraper-publisher": "^4.8.5", - "metascraper-soundcloud": "^4.8.5", + "metascraper-soundcloud": "^5.5.3", "metascraper-title": "^4.8.5", "metascraper-url": "^4.8.5", "metascraper-video": "^4.8.5", diff --git a/yarn.lock b/yarn.lock index c027764c0..3b15a333a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2269,6 +2269,11 @@ mem@~5.1.0: mimic-fn "^2.1.0" p-is-promise "^2.1.0" +memoize-one@~5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.4.tgz#005928aced5c43d890a4dfab18ca908b0ec92cbc" + integrity sha512-P0z5IeAH6qHHGkJIXWw0xC2HNEgkx/9uWWBQw64FJj3/ol14VYdfVGWWr0fXfjhhv3TKVIqUq65os6O4GUNksA== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -2356,12 +2361,14 @@ metascraper-publisher@^4.8.5: dependencies: "@metascraper/helpers" "^4.8.5" -metascraper-soundcloud@^4.8.5: - version "4.8.5" - resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-4.8.5.tgz#6593ba8a26fedbb4a3bebc6d2803e22b38278621" - integrity sha512-fChxmwqCLyans9RKKg1jaL7dh/6twIBgaQm/NjvlKcp4+V39J85wQlZPHBgoXl+K/uMwy94wMftKWWQ1Hxxgkw== +metascraper-soundcloud@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.5.3.tgz#6f54d5da12b617cff49eb7730ff4ff59f910e60e" + integrity sha512-e7rhediMbulUlLYwEsVmsWqoiy2EqYBrjHt9V6ASTnUeA/0o9/RjPQx7FYMp5p/RnSO0jTqj29TN8c94amPzqA== dependencies: - "@metascraper/helpers" "^4.8.5" + "@metascraper/helpers" "^5.5.0" + memoize-one "~5.0.4" + tldts "~5.2.0" metascraper-title@^4.8.5: version "4.8.5" @@ -3558,6 +3565,11 @@ tlds@^1.187.0, tlds@^1.203.0: resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== +tldts@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.2.1.tgz#8fe745feb8b822deda8d3677cf836a77028056db" + integrity sha512-/K8BtLl2ZQUmd3E5ecwlf73+7fPIBKBQpGg/6cQtclobqyDy6bQ8shgXwHiw9SDUmaBAQvJe832o4MFNeWk29g== + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" From cc6819e77bf7472e99471ff9bc4290bd3274f380 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 08:47:30 -0300 Subject: [PATCH 024/130] Root commit for master branch From eabb58e851d6a76802a7d7de8e3d6842c9d1dd3d Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 08:51:39 -0300 Subject: [PATCH 025/130] Merge in Nitro-Embed --- Human-Connection/.codecov.yml => .codecov.yml | 0 .../.gitbook.yaml => .gitbook.yaml | 0 .../assets/grafik (1).png | Bin .../assets/grafik-1 (1).png | Bin .../.gitbook => .gitbook}/assets/grafik-1.png | Bin .../.gitbook => .gitbook}/assets/grafik-4.png | Bin .../.gitbook => .gitbook}/assets/grafik.png | Bin .../assets/graphql-playground (1).png | Bin .../assets/graphql-playground.png | Bin .../assets/humanconnection (1).png | Bin .../assets/humanconnection.png | Bin .../assets/lets_get_together.png | Bin .../assets/screenshot (1).png | Bin ...-neo4j-download-center-current-releases.png | Bin .../assets/screenshot-styleguide (1).png | Bin .../assets/screenshot-styleguide (2).png | Bin .../assets/screenshot-styleguide.png | Bin .../assets/screenshot.png | Bin .../.github => .github}/ISSUE_TEMPLATE.md | 0 .../ISSUE_TEMPLATE/bug_report.md | 0 .../ISSUE_TEMPLATE/feature_request.md | 0 .../ISSUE_TEMPLATE/question.md | 0 .../PULL_REQUEST_TEMPLATE.md | 0 Human-Connection/.gitignore => .gitignore | 0 Human-Connection/.travis.yml => .travis.yml | 0 .../.vscode => .vscode}/extensions.json | 0 .../.vscode => .vscode}/settings.json | 0 .../CODE_OF_CONDUCT.md => CODE_OF_CONDUCT.md | 0 .../CONTRIBUTING.md => CONTRIBUTING.md | 0 .../maintenance-worker/binaries/.env | 6 ------ .../maintenance-worker/migration/mongo/.env | 17 ----------------- .../maintenance-worker/migration/neo4j/.env | 16 ---------------- .../styleguide/src/system/icons/svg/bold.svg | 5 ----- .../styleguide/src/system/icons/svg/italic.svg | 5 ----- .../src/system/icons/svg/list-ol.svg | 5 ----- .../src/system/icons/svg/list-ul.svg | 5 ----- .../src/system/icons/svg/paragraph.svg | 5 ----- .../src/system/icons/svg/quote-right.svg | 5 ----- Human-Connection/LICENSE.md => LICENSE.md | 0 Human-Connection/README.md => README.md | 0 Human-Connection/SUMMARY.md => SUMMARY.md | 0 {Human-Connection/backend => backend}/.babelrc | 0 .../backend => backend}/.codecov.yml | 0 .../backend => backend}/.dockerignore | 0 .../backend => backend}/.env.template | 0 .../backend => backend}/.eslintrc.js | 0 .../backend => backend}/.gitignore | 0 .../backend => backend}/.graphqlconfig | 0 .../backend => backend}/.prettierrc.js | 0 .../backend => backend}/Dockerfile | 0 .../backend => backend}/README.md | 0 .../backend => backend}/graphql-playground.png | Bin .../backend => backend}/graphql.md | 0 .../backend => backend}/humanconnection.png | Bin .../backend => backend}/package.json | 0 .../backend => backend}/public/.gitkeep | 0 .../img/badges/fundraisingbox_de_airship.svg | 0 .../img/badges/fundraisingbox_de_alienship.svg | 0 .../img/badges/fundraisingbox_de_balloon.svg | 0 .../badges/fundraisingbox_de_bigballoon.svg | 0 .../img/badges/fundraisingbox_de_crane.svg | 0 .../img/badges/fundraisingbox_de_glider.svg | 0 .../badges/fundraisingbox_de_helicopter.svg | 0 .../img/badges/fundraisingbox_de_starter.svg | 0 .../public/img/badges/indiegogo_en_bear.svg | 0 .../public/img/badges/indiegogo_en_panda.svg | 0 .../public/img/badges/indiegogo_en_rabbit.svg | 0 .../public/img/badges/indiegogo_en_racoon.svg | 0 .../public/img/badges/indiegogo_en_rhino.svg | 0 .../public/img/badges/indiegogo_en_tiger.svg | 0 .../public/img/badges/indiegogo_en_turtle.svg | 0 .../public/img/badges/indiegogo_en_whale.svg | 0 .../public/img/badges/indiegogo_en_wolf.svg | 0 .../public/img/badges/user_role_admin.svg | 0 .../public/img/badges/user_role_developer.svg | 0 .../public/img/badges/user_role_moderator.svg | 0 .../public/img/badges/wooold_de_bee.svg | 0 .../public/img/badges/wooold_de_butterfly.svg | 0 .../img/badges/wooold_de_double_rainbow.svg | 0 .../img/badges/wooold_de_end_of_rainbow.svg | 0 .../public/img/badges/wooold_de_flower.svg | 0 .../public/img/badges/wooold_de_lifetree.svg | 0 .../img/badges/wooold_de_magic_rainbow.svg | 0 .../img/badges/wooold_de_super_founder.svg | 0 .../public/uploads/.gitkeep | 0 .../src/activitypub/ActivityPub.js | 0 .../src/activitypub/Collections.js | 0 .../src/activitypub/NitroDataSource.js | 0 .../src/activitypub/routes/inbox.js | 0 .../src/activitypub/routes/index.js | 0 .../src/activitypub/routes/serveUser.js | 0 .../src/activitypub/routes/user.js | 0 .../src/activitypub/routes/verify.js | 0 .../src/activitypub/routes/webFinger.js | 0 .../activitypub/security/httpSignature.spec.js | 0 .../src/activitypub/security/index.js | 0 .../src/activitypub/utils/activity.js | 0 .../src/activitypub/utils/actor.js | 0 .../src/activitypub/utils/collection.js | 0 .../src/activitypub/utils/index.js | 0 .../src/bootstrap/directives.js | 0 .../backend => backend}/src/bootstrap/neo4j.js | 0 .../src/bootstrap/scalars.js | 0 .../backend => backend}/src/config/index.js | 0 .../src/helpers/asyncForEach.js | 0 .../src/helpers/walkRecursive.js | 0 .../backend => backend}/src/index.js | 0 .../backend => backend}/src/jest/helpers.js | 0 .../backend => backend}/src/jwt/decode.js | 0 .../backend => backend}/src/jwt/encode.js | 0 .../src/middleware/activityPubMiddleware.js | 0 .../src/middleware/dateTimeMiddleware.js | 0 .../src/middleware/excerptMiddleware.js | 0 .../filterBubble/filterBubble.spec.js | 0 .../src/middleware/includedFieldsMiddleware.js | 0 .../src/middleware/index.js | 0 .../src/middleware/nodes/locations.js | 0 .../notifications/extractIds/index.js | 0 .../notifications/extractIds/spec.js | 0 .../src/middleware/notifications/index.js | 0 .../src/middleware/notifications/spec.js | 0 .../src/middleware/orderByMiddleware.js | 0 .../src/middleware/orderByMiddleware.spec.js | 0 .../src/middleware/passwordMiddleware.js | 0 .../src/middleware/permissionsMiddleware.js | 0 .../middleware/permissionsMiddleware.spec.js | 0 .../src/middleware/sluggifyMiddleware.js | 0 .../src/middleware/slugify/uniqueSlug.js | 0 .../src/middleware/slugify/uniqueSlug.spec.js | 0 .../src/middleware/slugifyMiddleware.spec.js | 0 .../src/middleware/softDeleteMiddleware.js | 0 .../middleware/softDeleteMiddleware.spec.js | 0 .../src/middleware/userMiddleware.js | 0 .../src/middleware/validation/index.js | 0 .../src/middleware/xssMiddleware.js | 0 .../backend => backend}/src/mocks/index.js | 0 .../backend => backend}/src/schema/index.js | 0 .../src/schema/resolvers/badges.spec.js | 0 .../src/schema/resolvers/comments.js | 0 .../src/schema/resolvers/comments.spec.js | 0 .../src/schema/resolvers/fileUpload/index.js | 0 .../src/schema/resolvers/fileUpload/spec.js | 0 .../src/schema/resolvers/follow.js | 0 .../src/schema/resolvers/follow.spec.js | 0 .../src/schema/resolvers/index.js | 0 .../src/schema/resolvers/moderation.js | 0 .../src/schema/resolvers/moderation.spec.js | 0 .../src/schema/resolvers/notifications.js | 0 .../src/schema/resolvers/notifications.spec.js | 0 .../src/schema/resolvers/passwordReset.js | 0 .../src/schema/resolvers/passwordReset.spec.js | 0 .../resolvers/passwordReset/emailTemplates.js | 0 .../src/schema/resolvers/posts.js | 0 .../src/schema/resolvers/posts.spec.js | 0 .../src/schema/resolvers/reports.js | 0 .../src/schema/resolvers/reports.spec.js | 0 .../src/schema/resolvers/rewards.js | 0 .../src/schema/resolvers/rewards.spec.js | 0 .../src/schema/resolvers/shout.js | 0 .../src/schema/resolvers/shout.spec.js | 0 .../src/schema/resolvers/socialMedia.js | 0 .../src/schema/resolvers/socialMedia.spec.js | 0 .../src/schema/resolvers/statistics.js | 0 .../src/schema/resolvers/user_management.js | 0 .../schema/resolvers/user_management.spec.js | 0 .../src/schema/resolvers/users.js | 0 .../src/schema/resolvers/users.spec.js | 0 .../src/schema/types/enum/BadgeStatus.gql | 0 .../src/schema/types/enum/BadgeType.gql | 0 .../src/schema/types/enum/UserGroup.gql | 0 .../src/schema/types/enum/Visibility.gql | 0 .../src/schema/types/index.js | 0 .../src/schema/types/scalar/Date.gql_ | 0 .../src/schema/types/scalar/DateTime.gql_ | 0 .../src/schema/types/scalar/Time.gql_ | 0 .../src/schema/types/scalar/Upload.gql | 0 .../src/schema/types/schema.gql | 0 .../src/schema/types/schema_full.gql_ | 0 .../src/schema/types/type/Badge.gql | 0 .../src/schema/types/type/Category.gql | 0 .../src/schema/types/type/Comment.gql | 0 .../src/schema/types/type/Post.gql | 0 .../src/schema/types/type/Tag.gql | 0 .../src/schema/types/type/User.gql | 0 .../src/seed/factories/badges.js | 0 .../src/seed/factories/categories.js | 0 .../src/seed/factories/comments.js | 0 .../src/seed/factories/index.js | 0 .../src/seed/factories/notifications.js | 0 .../src/seed/factories/organizations.js | 0 .../src/seed/factories/posts.js | 0 .../src/seed/factories/reports.js | 0 .../src/seed/factories/tags.js | 0 .../src/seed/factories/users.js | 0 .../backend => backend}/src/seed/reset-db.js | 0 .../backend => backend}/src/seed/seed-db.js | 0 .../src/seed/seed-helpers.js | 0 .../backend => backend}/src/server.js | 0 .../test/features/activity-delete.feature | 0 .../test/features/activity-follow.feature | 0 .../test/features/activity-like.feature | 0 .../test/features/collection.feature | 0 .../test/features/object-article.feature | 0 .../test/features/support/steps.js | 0 .../test/features/webfinger.feature | 0 .../backend => backend}/test/features/world.js | 0 .../backend => backend}/testing.md | 0 .../backend => backend}/yarn.lock | 0 ....template.json => cypress.env.template.json | 0 Human-Connection/cypress.json => cypress.json | 0 .../cypress => cypress}/README.md | 0 .../cypress => cypress}/features.md | 0 .../cypress => cypress}/fixtures/example.json | 0 .../fixtures/onourjourney.png | Bin .../cypress => cypress}/fixtures/users.json | 0 .../administration/TagsAndCategories.feature | 0 .../integration/common/admin.js | 0 .../integration/common/post.js | 0 .../integration/common/profile.js | 0 .../integration/common/report.js | 0 .../integration/common/search.js | 0 .../integration/common/settings.js | 0 .../integration/common/steps.js | 0 .../Internationalization.feature | 0 .../integration/moderation/HidePosts.feature | 0 .../moderation/ReportContent.feature | 0 .../integration/notifications/Mentions.feature | 0 .../integration/post/Comment.feature | 0 .../integration/post/PersistentLinks.feature | 0 .../integration/post/WritePost.feature | 0 .../integration/search/Search.feature | 0 .../user_account/ChangePassword.feature | 0 .../integration/user_account/Login.feature | 0 .../user_profile/AboutMeAndLocation.feature | 0 .../user_profile/SocialMedia.feature | 0 .../UploadUserProfileImage.feature | 0 .../cypress => cypress}/plugins/index.js | 0 .../cypress => cypress}/support/commands.js | 0 .../cypress => cypress}/support/factories.js | 0 .../cypress => cypress}/support/helpers.js | 0 .../cypress => cypress}/support/index.js | 0 .../deployment => deployment}/.gitignore | 0 .../deployment => deployment}/README.md | 0 .../digital-ocean/README.md | 0 .../digital-ocean/dashboard/README.md | 0 .../digital-ocean/dashboard/admin-user.yaml | 0 .../dashboard/dashboard-screenshot.png | Bin .../digital-ocean/dashboard/role-binding.yaml | 0 .../digital-ocean/https/.gitignore | 0 .../digital-ocean/https/README.md | 0 .../digital-ocean/https/ip-address.png | Bin .../digital-ocean/https/namespace.yaml | 0 .../https/templates/ingress.template.yaml | 0 .../https/templates/issuer.template.yaml | 0 .../human-connection/README.md | 0 .../human-connection/deployment-backend.yaml | 0 .../human-connection/deployment-neo4j.yaml | 0 .../human-connection/deployment-web.yaml | 0 .../human-connection/mailserver/README.md | 0 .../mailserver/deployment-mailserver.yaml | 0 .../mailserver/service-mailserver.yaml | 0 .../human-connection/service-backend.yaml | 0 .../human-connection/service-neo4j.yaml | 0 .../human-connection/service-web.yaml | 0 .../templates/configmap.template.yaml | 0 .../templates/secrets.template.yaml | 0 .../legacy-migration/README.md | 0 .../legacy-migration/maintenance-worker.yaml | 0 .../maintenance-worker/.dockerignore | 0 .../maintenance-worker/.gitignore | 0 .../maintenance-worker/Dockerfile | 0 .../maintenance-worker/binaries/idle | 0 .../binaries/import_legacy_db | 0 .../binaries/import_legacy_uploads | 0 .../maintenance-worker/known_hosts | 0 .../migration/mongo/export.sh | 0 .../migration/neo4j/badges/badges.cql | 0 .../migration/neo4j/badges/delete.cql | 0 .../migration/neo4j/categories/categories.cql | 0 .../migration/neo4j/categories/delete.cql | 0 .../migration/neo4j/comments/comments.cql | 0 .../migration/neo4j/comments/delete.cql | 0 .../neo4j/contributions/contributions.cql | 0 .../migration/neo4j/contributions/delete.cql | 0 .../migration/neo4j/delete_all.cql | 0 .../migration/neo4j/emotions/delete.cql | 0 .../migration/neo4j/emotions/emotions.cql | 0 .../migration/neo4j/follows/delete.cql | 0 .../migration/neo4j/follows/follows.cql | 0 .../migration/neo4j/import.sh | 0 .../migration/neo4j/invites/delete.cql | 0 .../migration/neo4j/invites/invites.cql | 0 .../migration/neo4j/notifications/delete.cql | 0 .../neo4j/notifications/notifications.cql | 0 .../migration/neo4j/organizations/delete.cql | 0 .../neo4j/organizations/organizations.cql | 0 .../migration/neo4j/pages/delete.cql | 0 .../migration/neo4j/pages/pages.cql | 0 .../migration/neo4j/projects/delete.cql | 0 .../migration/neo4j/projects/projects.cql | 0 .../migration/neo4j/settings/delete.cql | 0 .../migration/neo4j/settings/settings.cql | 0 .../migration/neo4j/shouts/delete.cql | 0 .../migration/neo4j/shouts/shouts.cql | 0 .../migration/neo4j/status/delete.cql | 0 .../migration/neo4j/status/status.cql | 0 .../neo4j/systemnotifications/delete.cql | 0 .../systemnotifications.cql | 0 .../migration/neo4j/users/delete.cql | 0 .../migration/neo4j/users/users.cql | 0 .../migration/neo4j/userscandos/delete.cql | 0 .../neo4j/userscandos/userscandos.cql | 0 .../migration/neo4j/usersettings/delete.cql | 0 .../neo4j/usersettings/usersettings.cql | 0 .../minikube/README.md | 0 .../deployment => deployment}/namespace.yaml | 0 .../volumes/README.md | 0 .../volumes/neo4j-data.yaml | 0 .../volumes/neo4j-offline-backup/README.md | 0 .../volumes/reclaim-policy/README.md | 0 .../volumes/uploads.yaml | 0 .../volumes/velero/README.md | 0 .../volumes/volume-snapshots/README.md | 0 .../digital-ocean-volume-snapshots.png | Bin .../volumes/volume-snapshots/neo4j-data.yaml | 0 .../volumes/volume-snapshots/snapshot.yaml | 0 ...nance.yml => docker-compose.maintenance.yml | 0 ...override.yml => docker-compose.override.yml | 0 ...ose.travis.yml => docker-compose.travis.yml | 0 .../docker-compose.yml => docker-compose.yml | 0 ...umentation.md => edit-this-documentation.md | 0 .../installation.md => installation.md | 0 .../neo4j => neo4j}/.env.template | 0 {Human-Connection/neo4j => neo4j}/.gitignore | 0 {Human-Connection/neo4j => neo4j}/Dockerfile | 0 {Human-Connection/neo4j => neo4j}/README.md | 0 {Human-Connection/neo4j => neo4j}/db_setup.sh | 0 .../neo4j => neo4j}/entrypoint.sh | 0 Human-Connection/package.json => package.json | 0 .../scripts => scripts}/deploy.sh | 0 .../scripts => scripts}/docker_push.sh | 0 .../scripts => scripts}/patch-deployment.yaml | 0 .../scripts => scripts}/setup_kubernetes.sh | 0 Human-Connection/testing.md => testing.md | 0 {Human-Connection/webapp => webapp}/.babelrc | 0 .../webapp => webapp}/.dockerignore | 0 .../webapp => webapp}/.editorconfig | 0 .../webapp => webapp}/.env.template | 0 .../webapp => webapp}/.eslintignore | 0 .../webapp => webapp}/.eslintrc.js | 0 {Human-Connection/webapp => webapp}/.gitignore | 0 .../webapp => webapp}/.prettierrc.js | 0 {Human-Connection/webapp => webapp}/Dockerfile | 0 {Human-Connection/webapp => webapp}/README.md | 0 {Human-Connection/webapp => webapp}/assets.md | 0 .../assets/styles/imports/_toast.scss | 0 .../assets/styles/imports/_tooltip.scss | 0 .../webapp => webapp}/assets/styles/main.scss | 0 .../webapp => webapp}/components.md | 0 .../components/Avatar/Avatar.spec.js | 0 .../components/Avatar/Avatar.vue | 0 .../components/Badges.spec.js | 0 .../webapp => webapp}/components/Badges.vue | 0 .../CategoriesSelect/CategoriesSelect.spec.js | 0 .../CategoriesSelect/CategoriesSelect.vue | 0 .../components/Category/Readme.md | 0 .../components/Category/index.spec.js | 0 .../components/Category/index.vue | 0 .../components/Comment.spec.js | 0 .../webapp => webapp}/components/Comment.vue | 0 .../components/ContentMenu.vue | 0 .../ContributionForm/ContributionForm.spec.js | 0 .../ContributionForm/ContributionForm.vue | 0 .../webapp => webapp}/components/CountTo.vue | 0 .../components/DeleteData/DeleteData.spec.js | 0 .../components/DeleteData/DeleteData.vue | 0 .../webapp => webapp}/components/Dropdown.vue | 0 .../components/Editor/index.vue | 0 .../components/Editor/nodes/Mention.js | 0 .../components/Editor/plugins/eventHandler.js | 0 .../components/Editor/spec.js | 0 .../webapp => webapp}/components/Empty.vue | 0 .../components/FilterMenu/FilterMenu.spec.js | 0 .../components/FilterMenu/FilterMenu.vue | 0 .../components/FollowButton.vue | 0 .../webapp => webapp}/components/LoadMore.vue | 0 .../LocaleSwitch/LocaleSwitch.spec.js | 0 .../components/LocaleSwitch/LocaleSwitch.vue | 0 .../webapp => webapp}/components/Logo.vue | 0 .../webapp => webapp}/components/Modal.spec.js | 0 .../webapp => webapp}/components/Modal.vue | 0 .../components/Modal/ConfirmModal.spec.js | 0 .../components/Modal/ConfirmModal.vue | 0 .../components/Modal/DisableModal.spec.js | 0 .../components/Modal/DisableModal.vue | 0 .../components/Modal/ReportModal.spec.js | 0 .../components/Modal/ReportModal.vue | 0 .../components/Password/Change.spec.js | 0 .../components/Password/Change.vue | 0 .../components/Password/Strength.vue | 0 .../PasswordReset/ChangePassword.spec.js | 0 .../PasswordReset/ChangePassword.vue | 0 .../components/PasswordReset/Request.spec.js | 0 .../components/PasswordReset/Request.vue | 0 .../PasswordReset/VerifyCode.spec.js | 0 .../components/PasswordReset/VerifyCode.vue | 0 .../components/PostCard/index.spec.js | 0 .../components/PostCard/index.vue | 0 .../components/RelativeDateTime/Readme.md | 0 .../components/RelativeDateTime/index.vue | 0 .../components/RelativeDateTime/spec.js | 0 .../ReleaseModal/ReleaseModal.spec.js | 0 .../components/ReleaseModal/ReleaseModal.vue | 0 .../components/Ribbon/index.spec.js | 0 .../components/Ribbon/index.vue | 0 .../components/SearchInput.spec.js | 0 .../components/SearchInput.vue | 0 .../components/ShoutButton.vue | 0 .../webapp => webapp}/components/Tag/Readme.md | 0 .../webapp => webapp}/components/Tag/index.vue | 0 .../webapp => webapp}/components/Tag/spec.js | 0 .../components/TeaserImage/TeaserImage.spec.js | 0 .../components/TeaserImage/TeaserImage.vue | 0 .../components/Upload/index.vue | 0 .../components/Upload/spec.js | 0 .../components/User/index.vue | 0 .../webapp => webapp}/components/User/spec.js | 0 .../components/comments/CommentForm/index.vue | 0 .../components/comments/CommentForm/spec.js | 0 .../comments/CommentList/CommentList.spec.js | 0 .../components/comments/CommentList/index.vue | 0 .../notifications/Notification/index.vue | 0 .../notifications/Notification/spec.js | 0 .../notifications/NotificationList/index.vue | 0 .../notifications/NotificationList/spec.js | 0 .../notifications/NotificationMenu/index.vue | 0 .../notifications/NotificationMenu/spec.js | 0 .../components/utils/PostHelpers.js | 0 .../graphql/CommentMutations.js | 0 .../webapp => webapp}/graphql/CommentQuery.js | 0 .../graphql/ModerationListQuery.js | 0 .../graphql/PostCommentsQuery.js | 0 .../webapp => webapp}/graphql/PostMutations.js | 0 .../webapp => webapp}/graphql/PostQuery.js | 0 .../graphql/UserProfile/Post.js | 0 .../graphql/UserProfile/User.js | 0 {Human-Connection/webapp => webapp}/layouts.md | 0 .../webapp => webapp}/layouts/blank.vue | 0 .../webapp => webapp}/layouts/default.vue | 0 .../webapp => webapp}/locales/de.json | 0 .../webapp => webapp}/locales/en.json | 0 .../webapp => webapp}/locales/es.json | 0 .../webapp => webapp}/locales/fr.json | 0 .../webapp => webapp}/locales/index.js | 0 .../webapp => webapp}/locales/it.json | 0 .../webapp => webapp}/locales/nl.json | 0 .../webapp => webapp}/locales/pl.json | 0 .../webapp => webapp}/locales/pt.json | 0 .../webapp => webapp}/lokalise.png | Bin .../webapp => webapp}/middleware.md | 0 .../middleware/authenticated.js | 0 .../webapp => webapp}/middleware/isAdmin.js | 0 .../middleware/isModerator.js | 0 .../mixins/persistentLinks.js | 0 .../webapp => webapp}/mixins/seo.js | 0 .../webapp => webapp}/nuxt.config.js | 0 .../webapp => webapp}/package.json | 0 {Human-Connection/webapp => webapp}/pages.md | 0 .../webapp => webapp}/pages/admin.vue | 0 .../pages/admin/categories.vue | 0 .../webapp => webapp}/pages/admin/index.vue | 0 .../pages/admin/notifications.vue | 0 .../pages/admin/organizations.vue | 0 .../webapp => webapp}/pages/admin/pages.vue | 0 .../webapp => webapp}/pages/admin/settings.vue | 0 .../webapp => webapp}/pages/admin/tags.vue | 0 .../webapp => webapp}/pages/admin/users.vue | 0 .../webapp => webapp}/pages/index.vue | 0 .../webapp => webapp}/pages/login.vue | 0 .../webapp => webapp}/pages/logout.vue | 0 .../webapp => webapp}/pages/moderation.vue | 0 .../pages/moderation/index.vue | 0 .../webapp => webapp}/pages/password-reset.vue | 0 .../pages/password-reset/change-password.vue | 0 .../pages/password-reset/request.vue | 0 .../pages/password-reset/verify-code.vue | 0 .../webapp => webapp}/pages/post/_id.vue | 0 .../pages/post/_id/_slug/index.spec.js | 0 .../pages/post/_id/_slug/index.vue | 0 .../pages/post/_id/_slug/more-info.vue | 0 .../pages/post/_id/_slug/take-action.vue | 0 .../webapp => webapp}/pages/post/create.vue | 0 .../webapp => webapp}/pages/post/edit/_id.vue | 0 .../webapp => webapp}/pages/profile/_id.vue | 0 .../pages/profile/_id/_slug.spec.js | 0 .../pages/profile/_id/_slug.vue | 0 .../webapp => webapp}/pages/settings.vue | 0 .../pages/settings/data-download.vue | 0 .../pages/settings/delete-account.vue | 0 .../pages/settings/index.spec.js | 0 .../webapp => webapp}/pages/settings/index.vue | 0 .../pages/settings/invites.vue | 0 .../pages/settings/languages.vue | 0 .../pages/settings/my-organizations.vue | 0 .../pages/settings/my-social-media.spec.js | 0 .../pages/settings/my-social-media.vue | 0 .../pages/settings/security.vue | 0 {Human-Connection/webapp => webapp}/plugins.md | 0 .../webapp => webapp}/plugins/apollo-config.js | 0 .../webapp => webapp}/plugins/axios.js | 0 .../webapp => webapp}/plugins/i18n.js | 0 .../webapp => webapp}/plugins/izi-toast.js | 0 .../webapp => webapp}/plugins/keep-alive.js | 0 .../plugins/styleguide-dev.js | 0 .../webapp => webapp}/plugins/styleguide.js | 0 .../webapp => webapp}/plugins/v-tooltip.js | 0 .../plugins/vue-directives.js | 0 .../webapp => webapp}/plugins/vue-filters.js | 0 .../screenshot-styleguide.png | Bin .../webapp => webapp}/screenshot.png | Bin .../webapp => webapp}/server/index.js | 0 {Human-Connection/webapp => webapp}/static.md | 0 .../webapp => webapp}/static/favicon.ico | Bin .../static/img/empty-state.svg | 0 .../static/img/empty/alert.svg | 0 .../static/img/empty/docs.svg | 0 .../static/img/empty/events.svg | 0 .../static/img/empty/file.svg | 0 .../static/img/empty/messages.svg | 0 .../static/img/empty/tasks.svg | 0 .../static/img/locale-flags/de.svg | 0 .../static/img/locale-flags/en.svg | 0 .../static/img/locale-flags/es.svg | 0 .../static/img/locale-flags/fr.svg | 0 .../static/img/locale-flags/it.svg | 0 .../static/img/locale-flags/nl.svg | 0 .../static/img/locale-flags/pl.svg | 0 .../static/img/locale-flags/pt.svg | 0 .../static/img/sign-up/alpha-invite.png | Bin .../static/img/sign-up/alpha-invite2x.png | Bin .../static/img/sign-up/humanconnection.png | Bin .../static/img/sign-up/humanconnection.svg | 0 .../static/img/sign-up/nicetomeetyou.png | Bin .../static/img/sign-up/nicetomeetyou.svg | 0 .../static/img/sign-up/onourjourney.png | Bin .../static/img/sign-up/onourjourney.svg | 0 {Human-Connection/webapp => webapp}/store.md | 0 .../webapp => webapp}/store/auth.js | 0 .../webapp => webapp}/store/auth.test.js | 0 .../webapp => webapp}/store/editor.js | 0 .../webapp => webapp}/store/editor.spec.js | 0 .../webapp => webapp}/store/index.js | 0 .../webapp => webapp}/store/modal.js | 0 .../webapp => webapp}/store/notifications.js | 0 .../webapp => webapp}/store/search.js | 0 .../webapp => webapp}/styleguide.md | 0 {Human-Connection/webapp => webapp}/testing.md | 0 {Human-Connection/webapp => webapp}/yarn.lock | 0 Human-Connection/yarn.lock => yarn.lock | 0 559 files changed, 69 deletions(-) rename Human-Connection/.codecov.yml => .codecov.yml (100%) rename Human-Connection/.gitbook.yaml => .gitbook.yaml (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/grafik (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/grafik-1 (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/grafik-1.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/grafik-4.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/grafik.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/graphql-playground (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/graphql-playground.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/humanconnection (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/humanconnection.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/lets_get_together.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot-neo4j-download-center-current-releases.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot-styleguide (1).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot-styleguide (2).png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot-styleguide.png (100%) rename {Human-Connection/.gitbook => .gitbook}/assets/screenshot.png (100%) rename {Human-Connection/.github => .github}/ISSUE_TEMPLATE.md (100%) rename {Human-Connection/.github => .github}/ISSUE_TEMPLATE/bug_report.md (100%) rename {Human-Connection/.github => .github}/ISSUE_TEMPLATE/feature_request.md (100%) rename {Human-Connection/.github => .github}/ISSUE_TEMPLATE/question.md (100%) rename {Human-Connection/.github => .github}/PULL_REQUEST_TEMPLATE.md (100%) rename Human-Connection/.gitignore => .gitignore (100%) rename Human-Connection/.travis.yml => .travis.yml (100%) rename {Human-Connection/.vscode => .vscode}/extensions.json (100%) rename {Human-Connection/.vscode => .vscode}/settings.json (100%) rename Human-Connection/CODE_OF_CONDUCT.md => CODE_OF_CONDUCT.md (100%) rename Human-Connection/CONTRIBUTING.md => CONTRIBUTING.md (100%) delete mode 100644 Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/.env delete mode 100644 Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/.env delete mode 100644 Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/bold.svg delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/italic.svg delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/list-ol.svg delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/list-ul.svg delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/paragraph.svg delete mode 100755 Human-Connection/webapp/styleguide/src/system/icons/svg/quote-right.svg rename Human-Connection/LICENSE.md => LICENSE.md (100%) rename Human-Connection/README.md => README.md (100%) rename Human-Connection/SUMMARY.md => SUMMARY.md (100%) rename {Human-Connection/backend => backend}/.babelrc (100%) rename {Human-Connection/backend => backend}/.codecov.yml (100%) rename {Human-Connection/backend => backend}/.dockerignore (100%) rename {Human-Connection/backend => backend}/.env.template (100%) rename {Human-Connection/backend => backend}/.eslintrc.js (100%) rename {Human-Connection/backend => backend}/.gitignore (100%) rename {Human-Connection/backend => backend}/.graphqlconfig (100%) rename {Human-Connection/backend => backend}/.prettierrc.js (100%) rename {Human-Connection/backend => backend}/Dockerfile (100%) rename {Human-Connection/backend => backend}/README.md (100%) rename {Human-Connection/backend => backend}/graphql-playground.png (100%) rename {Human-Connection/backend => backend}/graphql.md (100%) rename {Human-Connection/backend => backend}/humanconnection.png (100%) rename {Human-Connection/backend => backend}/package.json (100%) rename {Human-Connection/backend => backend}/public/.gitkeep (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_airship.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_alienship.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_balloon.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_bigballoon.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_crane.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_glider.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_helicopter.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/fundraisingbox_de_starter.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_bear.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_panda.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_rabbit.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_racoon.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_rhino.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_tiger.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_turtle.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_whale.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/indiegogo_en_wolf.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/user_role_admin.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/user_role_developer.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/user_role_moderator.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_bee.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_butterfly.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_double_rainbow.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_end_of_rainbow.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_flower.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_lifetree.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_magic_rainbow.svg (100%) rename {Human-Connection/backend => backend}/public/img/badges/wooold_de_super_founder.svg (100%) rename {Human-Connection/backend => backend}/public/uploads/.gitkeep (100%) rename {Human-Connection/backend => backend}/src/activitypub/ActivityPub.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/Collections.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/NitroDataSource.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/inbox.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/index.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/serveUser.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/user.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/verify.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/routes/webFinger.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/security/httpSignature.spec.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/security/index.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/utils/activity.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/utils/actor.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/utils/collection.js (100%) rename {Human-Connection/backend => backend}/src/activitypub/utils/index.js (100%) rename {Human-Connection/backend => backend}/src/bootstrap/directives.js (100%) rename {Human-Connection/backend => backend}/src/bootstrap/neo4j.js (100%) rename {Human-Connection/backend => backend}/src/bootstrap/scalars.js (100%) rename {Human-Connection/backend => backend}/src/config/index.js (100%) rename {Human-Connection/backend => backend}/src/helpers/asyncForEach.js (100%) rename {Human-Connection/backend => backend}/src/helpers/walkRecursive.js (100%) rename {Human-Connection/backend => backend}/src/index.js (100%) rename {Human-Connection/backend => backend}/src/jest/helpers.js (100%) rename {Human-Connection/backend => backend}/src/jwt/decode.js (100%) rename {Human-Connection/backend => backend}/src/jwt/encode.js (100%) rename {Human-Connection/backend => backend}/src/middleware/activityPubMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/dateTimeMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/excerptMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/filterBubble/filterBubble.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/includedFieldsMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/index.js (100%) rename {Human-Connection/backend => backend}/src/middleware/nodes/locations.js (100%) rename {Human-Connection/backend => backend}/src/middleware/notifications/extractIds/index.js (100%) rename {Human-Connection/backend => backend}/src/middleware/notifications/extractIds/spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/notifications/index.js (100%) rename {Human-Connection/backend => backend}/src/middleware/notifications/spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/orderByMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/orderByMiddleware.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/passwordMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/permissionsMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/permissionsMiddleware.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/sluggifyMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/slugify/uniqueSlug.js (100%) rename {Human-Connection/backend => backend}/src/middleware/slugify/uniqueSlug.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/slugifyMiddleware.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/softDeleteMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/softDeleteMiddleware.spec.js (100%) rename {Human-Connection/backend => backend}/src/middleware/userMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/middleware/validation/index.js (100%) rename {Human-Connection/backend => backend}/src/middleware/xssMiddleware.js (100%) rename {Human-Connection/backend => backend}/src/mocks/index.js (100%) rename {Human-Connection/backend => backend}/src/schema/index.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/badges.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/comments.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/comments.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/fileUpload/index.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/fileUpload/spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/follow.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/follow.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/index.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/moderation.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/moderation.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/notifications.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/notifications.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/passwordReset.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/passwordReset.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/passwordReset/emailTemplates.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/posts.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/posts.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/reports.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/reports.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/rewards.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/rewards.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/shout.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/shout.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/socialMedia.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/socialMedia.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/statistics.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/user_management.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/user_management.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/users.js (100%) rename {Human-Connection/backend => backend}/src/schema/resolvers/users.spec.js (100%) rename {Human-Connection/backend => backend}/src/schema/types/enum/BadgeStatus.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/enum/BadgeType.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/enum/UserGroup.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/enum/Visibility.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/index.js (100%) rename {Human-Connection/backend => backend}/src/schema/types/scalar/Date.gql_ (100%) rename {Human-Connection/backend => backend}/src/schema/types/scalar/DateTime.gql_ (100%) rename {Human-Connection/backend => backend}/src/schema/types/scalar/Time.gql_ (100%) rename {Human-Connection/backend => backend}/src/schema/types/scalar/Upload.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/schema.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/schema_full.gql_ (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/Badge.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/Category.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/Comment.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/Post.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/Tag.gql (100%) rename {Human-Connection/backend => backend}/src/schema/types/type/User.gql (100%) rename {Human-Connection/backend => backend}/src/seed/factories/badges.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/categories.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/comments.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/index.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/notifications.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/organizations.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/posts.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/reports.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/tags.js (100%) rename {Human-Connection/backend => backend}/src/seed/factories/users.js (100%) rename {Human-Connection/backend => backend}/src/seed/reset-db.js (100%) rename {Human-Connection/backend => backend}/src/seed/seed-db.js (100%) rename {Human-Connection/backend => backend}/src/seed/seed-helpers.js (100%) rename {Human-Connection/backend => backend}/src/server.js (100%) rename {Human-Connection/backend => backend}/test/features/activity-delete.feature (100%) rename {Human-Connection/backend => backend}/test/features/activity-follow.feature (100%) rename {Human-Connection/backend => backend}/test/features/activity-like.feature (100%) rename {Human-Connection/backend => backend}/test/features/collection.feature (100%) rename {Human-Connection/backend => backend}/test/features/object-article.feature (100%) rename {Human-Connection/backend => backend}/test/features/support/steps.js (100%) rename {Human-Connection/backend => backend}/test/features/webfinger.feature (100%) rename {Human-Connection/backend => backend}/test/features/world.js (100%) rename {Human-Connection/backend => backend}/testing.md (100%) rename {Human-Connection/backend => backend}/yarn.lock (100%) rename Human-Connection/cypress.env.template.json => cypress.env.template.json (100%) rename Human-Connection/cypress.json => cypress.json (100%) rename {Human-Connection/cypress => cypress}/README.md (100%) rename {Human-Connection/cypress => cypress}/features.md (100%) rename {Human-Connection/cypress => cypress}/fixtures/example.json (100%) rename {Human-Connection/cypress => cypress}/fixtures/onourjourney.png (100%) rename {Human-Connection/cypress => cypress}/fixtures/users.json (100%) rename {Human-Connection/cypress => cypress}/integration/administration/TagsAndCategories.feature (100%) rename {Human-Connection/cypress => cypress}/integration/common/admin.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/post.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/profile.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/report.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/search.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/settings.js (100%) rename {Human-Connection/cypress => cypress}/integration/common/steps.js (100%) rename {Human-Connection/cypress => cypress}/integration/internationalization/Internationalization.feature (100%) rename {Human-Connection/cypress => cypress}/integration/moderation/HidePosts.feature (100%) rename {Human-Connection/cypress => cypress}/integration/moderation/ReportContent.feature (100%) rename {Human-Connection/cypress => cypress}/integration/notifications/Mentions.feature (100%) rename {Human-Connection/cypress => cypress}/integration/post/Comment.feature (100%) rename {Human-Connection/cypress => cypress}/integration/post/PersistentLinks.feature (100%) rename {Human-Connection/cypress => cypress}/integration/post/WritePost.feature (100%) rename {Human-Connection/cypress => cypress}/integration/search/Search.feature (100%) rename {Human-Connection/cypress => cypress}/integration/user_account/ChangePassword.feature (100%) rename {Human-Connection/cypress => cypress}/integration/user_account/Login.feature (100%) rename {Human-Connection/cypress => cypress}/integration/user_profile/AboutMeAndLocation.feature (100%) rename {Human-Connection/cypress => cypress}/integration/user_profile/SocialMedia.feature (100%) rename {Human-Connection/cypress => cypress}/integration/user_profile/UploadUserProfileImage.feature (100%) rename {Human-Connection/cypress => cypress}/plugins/index.js (100%) rename {Human-Connection/cypress => cypress}/support/commands.js (100%) rename {Human-Connection/cypress => cypress}/support/factories.js (100%) rename {Human-Connection/cypress => cypress}/support/helpers.js (100%) rename {Human-Connection/cypress => cypress}/support/index.js (100%) rename {Human-Connection/deployment => deployment}/.gitignore (100%) rename {Human-Connection/deployment => deployment}/README.md (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/README.md (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/dashboard/README.md (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/dashboard/admin-user.yaml (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/dashboard/dashboard-screenshot.png (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/dashboard/role-binding.yaml (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/.gitignore (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/README.md (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/ip-address.png (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/namespace.yaml (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/templates/ingress.template.yaml (100%) rename {Human-Connection/deployment => deployment}/digital-ocean/https/templates/issuer.template.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/README.md (100%) rename {Human-Connection/deployment => deployment}/human-connection/deployment-backend.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/deployment-neo4j.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/deployment-web.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/mailserver/README.md (100%) rename {Human-Connection/deployment => deployment}/human-connection/mailserver/deployment-mailserver.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/mailserver/service-mailserver.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/service-backend.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/service-neo4j.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/service-web.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/templates/configmap.template.yaml (100%) rename {Human-Connection/deployment => deployment}/human-connection/templates/secrets.template.yaml (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/README.md (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker.yaml (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/.dockerignore (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/.gitignore (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/Dockerfile (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/binaries/idle (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/binaries/import_legacy_db (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/binaries/import_legacy_uploads (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/known_hosts (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/mongo/export.sh (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/import.sh (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql (100%) rename {Human-Connection/deployment => deployment}/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql (100%) rename {Human-Connection/deployment => deployment}/minikube/README.md (100%) rename {Human-Connection/deployment => deployment}/namespace.yaml (100%) rename {Human-Connection/deployment => deployment}/volumes/README.md (100%) rename {Human-Connection/deployment => deployment}/volumes/neo4j-data.yaml (100%) rename {Human-Connection/deployment => deployment}/volumes/neo4j-offline-backup/README.md (100%) rename {Human-Connection/deployment => deployment}/volumes/reclaim-policy/README.md (100%) rename {Human-Connection/deployment => deployment}/volumes/uploads.yaml (100%) rename {Human-Connection/deployment => deployment}/volumes/velero/README.md (100%) rename {Human-Connection/deployment => deployment}/volumes/volume-snapshots/README.md (100%) rename {Human-Connection/deployment => deployment}/volumes/volume-snapshots/digital-ocean-volume-snapshots.png (100%) rename {Human-Connection/deployment => deployment}/volumes/volume-snapshots/neo4j-data.yaml (100%) rename {Human-Connection/deployment => deployment}/volumes/volume-snapshots/snapshot.yaml (100%) rename Human-Connection/docker-compose.maintenance.yml => docker-compose.maintenance.yml (100%) rename Human-Connection/docker-compose.override.yml => docker-compose.override.yml (100%) rename Human-Connection/docker-compose.travis.yml => docker-compose.travis.yml (100%) rename Human-Connection/docker-compose.yml => docker-compose.yml (100%) rename Human-Connection/edit-this-documentation.md => edit-this-documentation.md (100%) rename Human-Connection/installation.md => installation.md (100%) rename {Human-Connection/neo4j => neo4j}/.env.template (100%) rename {Human-Connection/neo4j => neo4j}/.gitignore (100%) rename {Human-Connection/neo4j => neo4j}/Dockerfile (100%) rename {Human-Connection/neo4j => neo4j}/README.md (100%) rename {Human-Connection/neo4j => neo4j}/db_setup.sh (100%) rename {Human-Connection/neo4j => neo4j}/entrypoint.sh (100%) rename Human-Connection/package.json => package.json (100%) rename {Human-Connection/scripts => scripts}/deploy.sh (100%) rename {Human-Connection/scripts => scripts}/docker_push.sh (100%) rename {Human-Connection/scripts => scripts}/patch-deployment.yaml (100%) rename {Human-Connection/scripts => scripts}/setup_kubernetes.sh (100%) rename Human-Connection/testing.md => testing.md (100%) rename {Human-Connection/webapp => webapp}/.babelrc (100%) rename {Human-Connection/webapp => webapp}/.dockerignore (100%) rename {Human-Connection/webapp => webapp}/.editorconfig (100%) rename {Human-Connection/webapp => webapp}/.env.template (100%) rename {Human-Connection/webapp => webapp}/.eslintignore (100%) rename {Human-Connection/webapp => webapp}/.eslintrc.js (100%) rename {Human-Connection/webapp => webapp}/.gitignore (100%) rename {Human-Connection/webapp => webapp}/.prettierrc.js (100%) rename {Human-Connection/webapp => webapp}/Dockerfile (100%) rename {Human-Connection/webapp => webapp}/README.md (100%) rename {Human-Connection/webapp => webapp}/assets.md (100%) rename {Human-Connection/webapp => webapp}/assets/styles/imports/_toast.scss (100%) rename {Human-Connection/webapp => webapp}/assets/styles/imports/_tooltip.scss (100%) rename {Human-Connection/webapp => webapp}/assets/styles/main.scss (100%) rename {Human-Connection/webapp => webapp}/components.md (100%) rename {Human-Connection/webapp => webapp}/components/Avatar/Avatar.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Avatar/Avatar.vue (100%) rename {Human-Connection/webapp => webapp}/components/Badges.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Badges.vue (100%) rename {Human-Connection/webapp => webapp}/components/CategoriesSelect/CategoriesSelect.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/CategoriesSelect/CategoriesSelect.vue (100%) rename {Human-Connection/webapp => webapp}/components/Category/Readme.md (100%) rename {Human-Connection/webapp => webapp}/components/Category/index.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Category/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/Comment.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Comment.vue (100%) rename {Human-Connection/webapp => webapp}/components/ContentMenu.vue (100%) rename {Human-Connection/webapp => webapp}/components/ContributionForm/ContributionForm.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/ContributionForm/ContributionForm.vue (100%) rename {Human-Connection/webapp => webapp}/components/CountTo.vue (100%) rename {Human-Connection/webapp => webapp}/components/DeleteData/DeleteData.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/DeleteData/DeleteData.vue (100%) rename {Human-Connection/webapp => webapp}/components/Dropdown.vue (100%) rename {Human-Connection/webapp => webapp}/components/Editor/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/Editor/nodes/Mention.js (100%) rename {Human-Connection/webapp => webapp}/components/Editor/plugins/eventHandler.js (100%) rename {Human-Connection/webapp => webapp}/components/Editor/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Empty.vue (100%) rename {Human-Connection/webapp => webapp}/components/FilterMenu/FilterMenu.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/FilterMenu/FilterMenu.vue (100%) rename {Human-Connection/webapp => webapp}/components/FollowButton.vue (100%) rename {Human-Connection/webapp => webapp}/components/LoadMore.vue (100%) rename {Human-Connection/webapp => webapp}/components/LocaleSwitch/LocaleSwitch.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/LocaleSwitch/LocaleSwitch.vue (100%) rename {Human-Connection/webapp => webapp}/components/Logo.vue (100%) rename {Human-Connection/webapp => webapp}/components/Modal.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Modal.vue (100%) rename {Human-Connection/webapp => webapp}/components/Modal/ConfirmModal.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Modal/ConfirmModal.vue (100%) rename {Human-Connection/webapp => webapp}/components/Modal/DisableModal.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Modal/DisableModal.vue (100%) rename {Human-Connection/webapp => webapp}/components/Modal/ReportModal.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Modal/ReportModal.vue (100%) rename {Human-Connection/webapp => webapp}/components/Password/Change.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Password/Change.vue (100%) rename {Human-Connection/webapp => webapp}/components/Password/Strength.vue (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/ChangePassword.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/ChangePassword.vue (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/Request.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/Request.vue (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/VerifyCode.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/PasswordReset/VerifyCode.vue (100%) rename {Human-Connection/webapp => webapp}/components/PostCard/index.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/PostCard/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/RelativeDateTime/Readme.md (100%) rename {Human-Connection/webapp => webapp}/components/RelativeDateTime/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/RelativeDateTime/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/ReleaseModal/ReleaseModal.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/ReleaseModal/ReleaseModal.vue (100%) rename {Human-Connection/webapp => webapp}/components/Ribbon/index.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/Ribbon/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/SearchInput.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/SearchInput.vue (100%) rename {Human-Connection/webapp => webapp}/components/ShoutButton.vue (100%) rename {Human-Connection/webapp => webapp}/components/Tag/Readme.md (100%) rename {Human-Connection/webapp => webapp}/components/Tag/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/Tag/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/TeaserImage/TeaserImage.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/TeaserImage/TeaserImage.vue (100%) rename {Human-Connection/webapp => webapp}/components/Upload/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/Upload/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/User/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/User/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/comments/CommentForm/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/comments/CommentForm/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/comments/CommentList/CommentList.spec.js (100%) rename {Human-Connection/webapp => webapp}/components/comments/CommentList/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/notifications/Notification/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/notifications/Notification/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/notifications/NotificationList/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/notifications/NotificationList/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/notifications/NotificationMenu/index.vue (100%) rename {Human-Connection/webapp => webapp}/components/notifications/NotificationMenu/spec.js (100%) rename {Human-Connection/webapp => webapp}/components/utils/PostHelpers.js (100%) rename {Human-Connection/webapp => webapp}/graphql/CommentMutations.js (100%) rename {Human-Connection/webapp => webapp}/graphql/CommentQuery.js (100%) rename {Human-Connection/webapp => webapp}/graphql/ModerationListQuery.js (100%) rename {Human-Connection/webapp => webapp}/graphql/PostCommentsQuery.js (100%) rename {Human-Connection/webapp => webapp}/graphql/PostMutations.js (100%) rename {Human-Connection/webapp => webapp}/graphql/PostQuery.js (100%) rename {Human-Connection/webapp => webapp}/graphql/UserProfile/Post.js (100%) rename {Human-Connection/webapp => webapp}/graphql/UserProfile/User.js (100%) rename {Human-Connection/webapp => webapp}/layouts.md (100%) rename {Human-Connection/webapp => webapp}/layouts/blank.vue (100%) rename {Human-Connection/webapp => webapp}/layouts/default.vue (100%) rename {Human-Connection/webapp => webapp}/locales/de.json (100%) rename {Human-Connection/webapp => webapp}/locales/en.json (100%) rename {Human-Connection/webapp => webapp}/locales/es.json (100%) rename {Human-Connection/webapp => webapp}/locales/fr.json (100%) rename {Human-Connection/webapp => webapp}/locales/index.js (100%) rename {Human-Connection/webapp => webapp}/locales/it.json (100%) rename {Human-Connection/webapp => webapp}/locales/nl.json (100%) rename {Human-Connection/webapp => webapp}/locales/pl.json (100%) rename {Human-Connection/webapp => webapp}/locales/pt.json (100%) rename {Human-Connection/webapp => webapp}/lokalise.png (100%) rename {Human-Connection/webapp => webapp}/middleware.md (100%) rename {Human-Connection/webapp => webapp}/middleware/authenticated.js (100%) rename {Human-Connection/webapp => webapp}/middleware/isAdmin.js (100%) rename {Human-Connection/webapp => webapp}/middleware/isModerator.js (100%) rename {Human-Connection/webapp => webapp}/mixins/persistentLinks.js (100%) rename {Human-Connection/webapp => webapp}/mixins/seo.js (100%) rename {Human-Connection/webapp => webapp}/nuxt.config.js (100%) rename {Human-Connection/webapp => webapp}/package.json (100%) rename {Human-Connection/webapp => webapp}/pages.md (100%) rename {Human-Connection/webapp => webapp}/pages/admin.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/categories.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/index.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/notifications.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/organizations.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/pages.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/settings.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/tags.vue (100%) rename {Human-Connection/webapp => webapp}/pages/admin/users.vue (100%) rename {Human-Connection/webapp => webapp}/pages/index.vue (100%) rename {Human-Connection/webapp => webapp}/pages/login.vue (100%) rename {Human-Connection/webapp => webapp}/pages/logout.vue (100%) rename {Human-Connection/webapp => webapp}/pages/moderation.vue (100%) rename {Human-Connection/webapp => webapp}/pages/moderation/index.vue (100%) rename {Human-Connection/webapp => webapp}/pages/password-reset.vue (100%) rename {Human-Connection/webapp => webapp}/pages/password-reset/change-password.vue (100%) rename {Human-Connection/webapp => webapp}/pages/password-reset/request.vue (100%) rename {Human-Connection/webapp => webapp}/pages/password-reset/verify-code.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/_id.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/_id/_slug/index.spec.js (100%) rename {Human-Connection/webapp => webapp}/pages/post/_id/_slug/index.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/_id/_slug/more-info.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/_id/_slug/take-action.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/create.vue (100%) rename {Human-Connection/webapp => webapp}/pages/post/edit/_id.vue (100%) rename {Human-Connection/webapp => webapp}/pages/profile/_id.vue (100%) rename {Human-Connection/webapp => webapp}/pages/profile/_id/_slug.spec.js (100%) rename {Human-Connection/webapp => webapp}/pages/profile/_id/_slug.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/data-download.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/delete-account.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/index.spec.js (100%) rename {Human-Connection/webapp => webapp}/pages/settings/index.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/invites.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/languages.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/my-organizations.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/my-social-media.spec.js (100%) rename {Human-Connection/webapp => webapp}/pages/settings/my-social-media.vue (100%) rename {Human-Connection/webapp => webapp}/pages/settings/security.vue (100%) rename {Human-Connection/webapp => webapp}/plugins.md (100%) rename {Human-Connection/webapp => webapp}/plugins/apollo-config.js (100%) rename {Human-Connection/webapp => webapp}/plugins/axios.js (100%) rename {Human-Connection/webapp => webapp}/plugins/i18n.js (100%) rename {Human-Connection/webapp => webapp}/plugins/izi-toast.js (100%) rename {Human-Connection/webapp => webapp}/plugins/keep-alive.js (100%) rename {Human-Connection/webapp => webapp}/plugins/styleguide-dev.js (100%) rename {Human-Connection/webapp => webapp}/plugins/styleguide.js (100%) rename {Human-Connection/webapp => webapp}/plugins/v-tooltip.js (100%) rename {Human-Connection/webapp => webapp}/plugins/vue-directives.js (100%) rename {Human-Connection/webapp => webapp}/plugins/vue-filters.js (100%) rename {Human-Connection/webapp => webapp}/screenshot-styleguide.png (100%) rename {Human-Connection/webapp => webapp}/screenshot.png (100%) rename {Human-Connection/webapp => webapp}/server/index.js (100%) rename {Human-Connection/webapp => webapp}/static.md (100%) rename {Human-Connection/webapp => webapp}/static/favicon.ico (100%) rename {Human-Connection/webapp => webapp}/static/img/empty-state.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/alert.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/docs.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/events.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/file.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/messages.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/empty/tasks.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/de.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/en.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/es.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/fr.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/it.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/nl.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/pl.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/locale-flags/pt.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/alpha-invite.png (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/alpha-invite2x.png (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/humanconnection.png (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/humanconnection.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/nicetomeetyou.png (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/nicetomeetyou.svg (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/onourjourney.png (100%) rename {Human-Connection/webapp => webapp}/static/img/sign-up/onourjourney.svg (100%) rename {Human-Connection/webapp => webapp}/store.md (100%) rename {Human-Connection/webapp => webapp}/store/auth.js (100%) rename {Human-Connection/webapp => webapp}/store/auth.test.js (100%) rename {Human-Connection/webapp => webapp}/store/editor.js (100%) rename {Human-Connection/webapp => webapp}/store/editor.spec.js (100%) rename {Human-Connection/webapp => webapp}/store/index.js (100%) rename {Human-Connection/webapp => webapp}/store/modal.js (100%) rename {Human-Connection/webapp => webapp}/store/notifications.js (100%) rename {Human-Connection/webapp => webapp}/store/search.js (100%) rename {Human-Connection/webapp => webapp}/styleguide.md (100%) rename {Human-Connection/webapp => webapp}/testing.md (100%) rename {Human-Connection/webapp => webapp}/yarn.lock (100%) rename Human-Connection/yarn.lock => yarn.lock (100%) diff --git a/Human-Connection/.codecov.yml b/.codecov.yml similarity index 100% rename from Human-Connection/.codecov.yml rename to .codecov.yml diff --git a/Human-Connection/.gitbook.yaml b/.gitbook.yaml similarity index 100% rename from Human-Connection/.gitbook.yaml rename to .gitbook.yaml diff --git a/Human-Connection/.gitbook/assets/grafik (1).png b/.gitbook/assets/grafik (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/grafik (1).png rename to .gitbook/assets/grafik (1).png diff --git a/Human-Connection/.gitbook/assets/grafik-1 (1).png b/.gitbook/assets/grafik-1 (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/grafik-1 (1).png rename to .gitbook/assets/grafik-1 (1).png diff --git a/Human-Connection/.gitbook/assets/grafik-1.png b/.gitbook/assets/grafik-1.png similarity index 100% rename from Human-Connection/.gitbook/assets/grafik-1.png rename to .gitbook/assets/grafik-1.png diff --git a/Human-Connection/.gitbook/assets/grafik-4.png b/.gitbook/assets/grafik-4.png similarity index 100% rename from Human-Connection/.gitbook/assets/grafik-4.png rename to .gitbook/assets/grafik-4.png diff --git a/Human-Connection/.gitbook/assets/grafik.png b/.gitbook/assets/grafik.png similarity index 100% rename from Human-Connection/.gitbook/assets/grafik.png rename to .gitbook/assets/grafik.png diff --git a/Human-Connection/.gitbook/assets/graphql-playground (1).png b/.gitbook/assets/graphql-playground (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/graphql-playground (1).png rename to .gitbook/assets/graphql-playground (1).png diff --git a/Human-Connection/.gitbook/assets/graphql-playground.png b/.gitbook/assets/graphql-playground.png similarity index 100% rename from Human-Connection/.gitbook/assets/graphql-playground.png rename to .gitbook/assets/graphql-playground.png diff --git a/Human-Connection/.gitbook/assets/humanconnection (1).png b/.gitbook/assets/humanconnection (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/humanconnection (1).png rename to .gitbook/assets/humanconnection (1).png diff --git a/Human-Connection/.gitbook/assets/humanconnection.png b/.gitbook/assets/humanconnection.png similarity index 100% rename from Human-Connection/.gitbook/assets/humanconnection.png rename to .gitbook/assets/humanconnection.png diff --git a/Human-Connection/.gitbook/assets/lets_get_together.png b/.gitbook/assets/lets_get_together.png similarity index 100% rename from Human-Connection/.gitbook/assets/lets_get_together.png rename to .gitbook/assets/lets_get_together.png diff --git a/Human-Connection/.gitbook/assets/screenshot (1).png b/.gitbook/assets/screenshot (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot (1).png rename to .gitbook/assets/screenshot (1).png diff --git a/Human-Connection/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png b/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot-neo4j-download-center-current-releases.png rename to .gitbook/assets/screenshot-neo4j-download-center-current-releases.png diff --git a/Human-Connection/.gitbook/assets/screenshot-styleguide (1).png b/.gitbook/assets/screenshot-styleguide (1).png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot-styleguide (1).png rename to .gitbook/assets/screenshot-styleguide (1).png diff --git a/Human-Connection/.gitbook/assets/screenshot-styleguide (2).png b/.gitbook/assets/screenshot-styleguide (2).png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot-styleguide (2).png rename to .gitbook/assets/screenshot-styleguide (2).png diff --git a/Human-Connection/.gitbook/assets/screenshot-styleguide.png b/.gitbook/assets/screenshot-styleguide.png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot-styleguide.png rename to .gitbook/assets/screenshot-styleguide.png diff --git a/Human-Connection/.gitbook/assets/screenshot.png b/.gitbook/assets/screenshot.png similarity index 100% rename from Human-Connection/.gitbook/assets/screenshot.png rename to .gitbook/assets/screenshot.png diff --git a/Human-Connection/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from Human-Connection/.github/ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE.md diff --git a/Human-Connection/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md similarity index 100% rename from Human-Connection/.github/ISSUE_TEMPLATE/bug_report.md rename to .github/ISSUE_TEMPLATE/bug_report.md diff --git a/Human-Connection/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from Human-Connection/.github/ISSUE_TEMPLATE/feature_request.md rename to .github/ISSUE_TEMPLATE/feature_request.md diff --git a/Human-Connection/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md similarity index 100% rename from Human-Connection/.github/ISSUE_TEMPLATE/question.md rename to .github/ISSUE_TEMPLATE/question.md diff --git a/Human-Connection/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from Human-Connection/.github/PULL_REQUEST_TEMPLATE.md rename to .github/PULL_REQUEST_TEMPLATE.md diff --git a/Human-Connection/.gitignore b/.gitignore similarity index 100% rename from Human-Connection/.gitignore rename to .gitignore diff --git a/Human-Connection/.travis.yml b/.travis.yml similarity index 100% rename from Human-Connection/.travis.yml rename to .travis.yml diff --git a/Human-Connection/.vscode/extensions.json b/.vscode/extensions.json similarity index 100% rename from Human-Connection/.vscode/extensions.json rename to .vscode/extensions.json diff --git a/Human-Connection/.vscode/settings.json b/.vscode/settings.json similarity index 100% rename from Human-Connection/.vscode/settings.json rename to .vscode/settings.json diff --git a/Human-Connection/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md similarity index 100% rename from Human-Connection/CODE_OF_CONDUCT.md rename to CODE_OF_CONDUCT.md diff --git a/Human-Connection/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 100% rename from Human-Connection/CONTRIBUTING.md rename to CONTRIBUTING.md diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/.env b/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/.env deleted file mode 100644 index 773918095..000000000 --- a/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/.env +++ /dev/null @@ -1,6 +0,0 @@ -# SSH Access -# SSH_USERNAME='username' -# SSH_HOST='example.org' - -# UPLOADS_DIRECTORY=/var/www/api/uploads -OUTPUT_DIRECTORY='/uploads/' \ No newline at end of file diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/.env b/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/.env deleted file mode 100644 index 4c5f9e18c..000000000 --- a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/.env +++ /dev/null @@ -1,17 +0,0 @@ -# SSH Access -# SSH_USERNAME='username' -# SSH_HOST='example.org' - -# Mongo DB on Remote Maschine -# MONGODB_USERNAME='mongouser' -# MONGODB_PASSWORD='mongopassword' -# MONGODB_DATABASE='mongodatabase' -# MONGODB_AUTH_DB='admin' - -# Export Settings -# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) -EXPORT_PATH='/tmp/mongo-export/' -EXPORT_MONGOEXPORT_BIN='mongoexport' -MONGO_EXPORT_SPLIT_SIZE=100 -# On Windows use something like this -# EXPORT_MONGOEXPORT_BIN='C:\Program Files\MongoDB\Server\3.6\bin\mongoexport.exe' diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env b/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env deleted file mode 100644 index 16220f3e6..000000000 --- a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env +++ /dev/null @@ -1,16 +0,0 @@ -# Neo4J Settings -# NEO4J_USERNAME='neo4j' -# NEO4J_PASSWORD='letmein' - -# Import Settings -# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) -IMPORT_PATH='/tmp/mongo-export/' -IMPORT_CHUNK_PATH='/tmp/mongo-export/splits/' - -IMPORT_CHUNK_PATH_CQL='/tmp/mongo-export/splits/' -# On Windows this path needs to be windows style since the cypher-shell runs native - note the forward slash -# IMPORT_CHUNK_PATH_CQL='C:/Users/dornhoeschen/AppData/Local/Temp/mongo-export/splits/' - -IMPORT_CYPHERSHELL_BIN='cypher-shell' -# On Windows use something like this -# IMPORT_CYPHERSHELL_BIN='C:\Program Files\neo4j-community\bin\cypher-shell.bat' \ No newline at end of file diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/bold.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/bold.svg deleted file mode 100755 index c3516808d..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/bold.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -bold - - diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/italic.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/italic.svg deleted file mode 100755 index 81d29483c..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/italic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -italic - - diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ol.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ol.svg deleted file mode 100755 index f3fb101ac..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ol.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -list-ol - - diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ul.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ul.svg deleted file mode 100755 index d565a8064..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/list-ul.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -list-ul - - diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/paragraph.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/paragraph.svg deleted file mode 100755 index 26365f984..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/paragraph.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -paragraph - - diff --git a/Human-Connection/webapp/styleguide/src/system/icons/svg/quote-right.svg b/Human-Connection/webapp/styleguide/src/system/icons/svg/quote-right.svg deleted file mode 100755 index 4e6469624..000000000 --- a/Human-Connection/webapp/styleguide/src/system/icons/svg/quote-right.svg +++ /dev/null @@ -1,5 +0,0 @@ - - -quote-right - - diff --git a/Human-Connection/LICENSE.md b/LICENSE.md similarity index 100% rename from Human-Connection/LICENSE.md rename to LICENSE.md diff --git a/Human-Connection/README.md b/README.md similarity index 100% rename from Human-Connection/README.md rename to README.md diff --git a/Human-Connection/SUMMARY.md b/SUMMARY.md similarity index 100% rename from Human-Connection/SUMMARY.md rename to SUMMARY.md diff --git a/Human-Connection/backend/.babelrc b/backend/.babelrc similarity index 100% rename from Human-Connection/backend/.babelrc rename to backend/.babelrc diff --git a/Human-Connection/backend/.codecov.yml b/backend/.codecov.yml similarity index 100% rename from Human-Connection/backend/.codecov.yml rename to backend/.codecov.yml diff --git a/Human-Connection/backend/.dockerignore b/backend/.dockerignore similarity index 100% rename from Human-Connection/backend/.dockerignore rename to backend/.dockerignore diff --git a/Human-Connection/backend/.env.template b/backend/.env.template similarity index 100% rename from Human-Connection/backend/.env.template rename to backend/.env.template diff --git a/Human-Connection/backend/.eslintrc.js b/backend/.eslintrc.js similarity index 100% rename from Human-Connection/backend/.eslintrc.js rename to backend/.eslintrc.js diff --git a/Human-Connection/backend/.gitignore b/backend/.gitignore similarity index 100% rename from Human-Connection/backend/.gitignore rename to backend/.gitignore diff --git a/Human-Connection/backend/.graphqlconfig b/backend/.graphqlconfig similarity index 100% rename from Human-Connection/backend/.graphqlconfig rename to backend/.graphqlconfig diff --git a/Human-Connection/backend/.prettierrc.js b/backend/.prettierrc.js similarity index 100% rename from Human-Connection/backend/.prettierrc.js rename to backend/.prettierrc.js diff --git a/Human-Connection/backend/Dockerfile b/backend/Dockerfile similarity index 100% rename from Human-Connection/backend/Dockerfile rename to backend/Dockerfile diff --git a/Human-Connection/backend/README.md b/backend/README.md similarity index 100% rename from Human-Connection/backend/README.md rename to backend/README.md diff --git a/Human-Connection/backend/graphql-playground.png b/backend/graphql-playground.png similarity index 100% rename from Human-Connection/backend/graphql-playground.png rename to backend/graphql-playground.png diff --git a/Human-Connection/backend/graphql.md b/backend/graphql.md similarity index 100% rename from Human-Connection/backend/graphql.md rename to backend/graphql.md diff --git a/Human-Connection/backend/humanconnection.png b/backend/humanconnection.png similarity index 100% rename from Human-Connection/backend/humanconnection.png rename to backend/humanconnection.png diff --git a/Human-Connection/backend/package.json b/backend/package.json similarity index 100% rename from Human-Connection/backend/package.json rename to backend/package.json diff --git a/Human-Connection/backend/public/.gitkeep b/backend/public/.gitkeep similarity index 100% rename from Human-Connection/backend/public/.gitkeep rename to backend/public/.gitkeep diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_airship.svg b/backend/public/img/badges/fundraisingbox_de_airship.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_airship.svg rename to backend/public/img/badges/fundraisingbox_de_airship.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_alienship.svg b/backend/public/img/badges/fundraisingbox_de_alienship.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_alienship.svg rename to backend/public/img/badges/fundraisingbox_de_alienship.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_balloon.svg b/backend/public/img/badges/fundraisingbox_de_balloon.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_balloon.svg rename to backend/public/img/badges/fundraisingbox_de_balloon.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_bigballoon.svg b/backend/public/img/badges/fundraisingbox_de_bigballoon.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_bigballoon.svg rename to backend/public/img/badges/fundraisingbox_de_bigballoon.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_crane.svg b/backend/public/img/badges/fundraisingbox_de_crane.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_crane.svg rename to backend/public/img/badges/fundraisingbox_de_crane.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_glider.svg b/backend/public/img/badges/fundraisingbox_de_glider.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_glider.svg rename to backend/public/img/badges/fundraisingbox_de_glider.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_helicopter.svg b/backend/public/img/badges/fundraisingbox_de_helicopter.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_helicopter.svg rename to backend/public/img/badges/fundraisingbox_de_helicopter.svg diff --git a/Human-Connection/backend/public/img/badges/fundraisingbox_de_starter.svg b/backend/public/img/badges/fundraisingbox_de_starter.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/fundraisingbox_de_starter.svg rename to backend/public/img/badges/fundraisingbox_de_starter.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_bear.svg b/backend/public/img/badges/indiegogo_en_bear.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_bear.svg rename to backend/public/img/badges/indiegogo_en_bear.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_panda.svg b/backend/public/img/badges/indiegogo_en_panda.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_panda.svg rename to backend/public/img/badges/indiegogo_en_panda.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_rabbit.svg b/backend/public/img/badges/indiegogo_en_rabbit.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_rabbit.svg rename to backend/public/img/badges/indiegogo_en_rabbit.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_racoon.svg b/backend/public/img/badges/indiegogo_en_racoon.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_racoon.svg rename to backend/public/img/badges/indiegogo_en_racoon.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_rhino.svg b/backend/public/img/badges/indiegogo_en_rhino.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_rhino.svg rename to backend/public/img/badges/indiegogo_en_rhino.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_tiger.svg b/backend/public/img/badges/indiegogo_en_tiger.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_tiger.svg rename to backend/public/img/badges/indiegogo_en_tiger.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_turtle.svg b/backend/public/img/badges/indiegogo_en_turtle.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_turtle.svg rename to backend/public/img/badges/indiegogo_en_turtle.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_whale.svg b/backend/public/img/badges/indiegogo_en_whale.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_whale.svg rename to backend/public/img/badges/indiegogo_en_whale.svg diff --git a/Human-Connection/backend/public/img/badges/indiegogo_en_wolf.svg b/backend/public/img/badges/indiegogo_en_wolf.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/indiegogo_en_wolf.svg rename to backend/public/img/badges/indiegogo_en_wolf.svg diff --git a/Human-Connection/backend/public/img/badges/user_role_admin.svg b/backend/public/img/badges/user_role_admin.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/user_role_admin.svg rename to backend/public/img/badges/user_role_admin.svg diff --git a/Human-Connection/backend/public/img/badges/user_role_developer.svg b/backend/public/img/badges/user_role_developer.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/user_role_developer.svg rename to backend/public/img/badges/user_role_developer.svg diff --git a/Human-Connection/backend/public/img/badges/user_role_moderator.svg b/backend/public/img/badges/user_role_moderator.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/user_role_moderator.svg rename to backend/public/img/badges/user_role_moderator.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_bee.svg b/backend/public/img/badges/wooold_de_bee.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_bee.svg rename to backend/public/img/badges/wooold_de_bee.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_butterfly.svg b/backend/public/img/badges/wooold_de_butterfly.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_butterfly.svg rename to backend/public/img/badges/wooold_de_butterfly.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_double_rainbow.svg b/backend/public/img/badges/wooold_de_double_rainbow.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_double_rainbow.svg rename to backend/public/img/badges/wooold_de_double_rainbow.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_end_of_rainbow.svg b/backend/public/img/badges/wooold_de_end_of_rainbow.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_end_of_rainbow.svg rename to backend/public/img/badges/wooold_de_end_of_rainbow.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_flower.svg b/backend/public/img/badges/wooold_de_flower.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_flower.svg rename to backend/public/img/badges/wooold_de_flower.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_lifetree.svg b/backend/public/img/badges/wooold_de_lifetree.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_lifetree.svg rename to backend/public/img/badges/wooold_de_lifetree.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_magic_rainbow.svg b/backend/public/img/badges/wooold_de_magic_rainbow.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_magic_rainbow.svg rename to backend/public/img/badges/wooold_de_magic_rainbow.svg diff --git a/Human-Connection/backend/public/img/badges/wooold_de_super_founder.svg b/backend/public/img/badges/wooold_de_super_founder.svg similarity index 100% rename from Human-Connection/backend/public/img/badges/wooold_de_super_founder.svg rename to backend/public/img/badges/wooold_de_super_founder.svg diff --git a/Human-Connection/backend/public/uploads/.gitkeep b/backend/public/uploads/.gitkeep similarity index 100% rename from Human-Connection/backend/public/uploads/.gitkeep rename to backend/public/uploads/.gitkeep diff --git a/Human-Connection/backend/src/activitypub/ActivityPub.js b/backend/src/activitypub/ActivityPub.js similarity index 100% rename from Human-Connection/backend/src/activitypub/ActivityPub.js rename to backend/src/activitypub/ActivityPub.js diff --git a/Human-Connection/backend/src/activitypub/Collections.js b/backend/src/activitypub/Collections.js similarity index 100% rename from Human-Connection/backend/src/activitypub/Collections.js rename to backend/src/activitypub/Collections.js diff --git a/Human-Connection/backend/src/activitypub/NitroDataSource.js b/backend/src/activitypub/NitroDataSource.js similarity index 100% rename from Human-Connection/backend/src/activitypub/NitroDataSource.js rename to backend/src/activitypub/NitroDataSource.js diff --git a/Human-Connection/backend/src/activitypub/routes/inbox.js b/backend/src/activitypub/routes/inbox.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/inbox.js rename to backend/src/activitypub/routes/inbox.js diff --git a/Human-Connection/backend/src/activitypub/routes/index.js b/backend/src/activitypub/routes/index.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/index.js rename to backend/src/activitypub/routes/index.js diff --git a/Human-Connection/backend/src/activitypub/routes/serveUser.js b/backend/src/activitypub/routes/serveUser.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/serveUser.js rename to backend/src/activitypub/routes/serveUser.js diff --git a/Human-Connection/backend/src/activitypub/routes/user.js b/backend/src/activitypub/routes/user.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/user.js rename to backend/src/activitypub/routes/user.js diff --git a/Human-Connection/backend/src/activitypub/routes/verify.js b/backend/src/activitypub/routes/verify.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/verify.js rename to backend/src/activitypub/routes/verify.js diff --git a/Human-Connection/backend/src/activitypub/routes/webFinger.js b/backend/src/activitypub/routes/webFinger.js similarity index 100% rename from Human-Connection/backend/src/activitypub/routes/webFinger.js rename to backend/src/activitypub/routes/webFinger.js diff --git a/Human-Connection/backend/src/activitypub/security/httpSignature.spec.js b/backend/src/activitypub/security/httpSignature.spec.js similarity index 100% rename from Human-Connection/backend/src/activitypub/security/httpSignature.spec.js rename to backend/src/activitypub/security/httpSignature.spec.js diff --git a/Human-Connection/backend/src/activitypub/security/index.js b/backend/src/activitypub/security/index.js similarity index 100% rename from Human-Connection/backend/src/activitypub/security/index.js rename to backend/src/activitypub/security/index.js diff --git a/Human-Connection/backend/src/activitypub/utils/activity.js b/backend/src/activitypub/utils/activity.js similarity index 100% rename from Human-Connection/backend/src/activitypub/utils/activity.js rename to backend/src/activitypub/utils/activity.js diff --git a/Human-Connection/backend/src/activitypub/utils/actor.js b/backend/src/activitypub/utils/actor.js similarity index 100% rename from Human-Connection/backend/src/activitypub/utils/actor.js rename to backend/src/activitypub/utils/actor.js diff --git a/Human-Connection/backend/src/activitypub/utils/collection.js b/backend/src/activitypub/utils/collection.js similarity index 100% rename from Human-Connection/backend/src/activitypub/utils/collection.js rename to backend/src/activitypub/utils/collection.js diff --git a/Human-Connection/backend/src/activitypub/utils/index.js b/backend/src/activitypub/utils/index.js similarity index 100% rename from Human-Connection/backend/src/activitypub/utils/index.js rename to backend/src/activitypub/utils/index.js diff --git a/Human-Connection/backend/src/bootstrap/directives.js b/backend/src/bootstrap/directives.js similarity index 100% rename from Human-Connection/backend/src/bootstrap/directives.js rename to backend/src/bootstrap/directives.js diff --git a/Human-Connection/backend/src/bootstrap/neo4j.js b/backend/src/bootstrap/neo4j.js similarity index 100% rename from Human-Connection/backend/src/bootstrap/neo4j.js rename to backend/src/bootstrap/neo4j.js diff --git a/Human-Connection/backend/src/bootstrap/scalars.js b/backend/src/bootstrap/scalars.js similarity index 100% rename from Human-Connection/backend/src/bootstrap/scalars.js rename to backend/src/bootstrap/scalars.js diff --git a/Human-Connection/backend/src/config/index.js b/backend/src/config/index.js similarity index 100% rename from Human-Connection/backend/src/config/index.js rename to backend/src/config/index.js diff --git a/Human-Connection/backend/src/helpers/asyncForEach.js b/backend/src/helpers/asyncForEach.js similarity index 100% rename from Human-Connection/backend/src/helpers/asyncForEach.js rename to backend/src/helpers/asyncForEach.js diff --git a/Human-Connection/backend/src/helpers/walkRecursive.js b/backend/src/helpers/walkRecursive.js similarity index 100% rename from Human-Connection/backend/src/helpers/walkRecursive.js rename to backend/src/helpers/walkRecursive.js diff --git a/Human-Connection/backend/src/index.js b/backend/src/index.js similarity index 100% rename from Human-Connection/backend/src/index.js rename to backend/src/index.js diff --git a/Human-Connection/backend/src/jest/helpers.js b/backend/src/jest/helpers.js similarity index 100% rename from Human-Connection/backend/src/jest/helpers.js rename to backend/src/jest/helpers.js diff --git a/Human-Connection/backend/src/jwt/decode.js b/backend/src/jwt/decode.js similarity index 100% rename from Human-Connection/backend/src/jwt/decode.js rename to backend/src/jwt/decode.js diff --git a/Human-Connection/backend/src/jwt/encode.js b/backend/src/jwt/encode.js similarity index 100% rename from Human-Connection/backend/src/jwt/encode.js rename to backend/src/jwt/encode.js diff --git a/Human-Connection/backend/src/middleware/activityPubMiddleware.js b/backend/src/middleware/activityPubMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/activityPubMiddleware.js rename to backend/src/middleware/activityPubMiddleware.js diff --git a/Human-Connection/backend/src/middleware/dateTimeMiddleware.js b/backend/src/middleware/dateTimeMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/dateTimeMiddleware.js rename to backend/src/middleware/dateTimeMiddleware.js diff --git a/Human-Connection/backend/src/middleware/excerptMiddleware.js b/backend/src/middleware/excerptMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/excerptMiddleware.js rename to backend/src/middleware/excerptMiddleware.js diff --git a/Human-Connection/backend/src/middleware/filterBubble/filterBubble.spec.js b/backend/src/middleware/filterBubble/filterBubble.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/filterBubble/filterBubble.spec.js rename to backend/src/middleware/filterBubble/filterBubble.spec.js diff --git a/Human-Connection/backend/src/middleware/includedFieldsMiddleware.js b/backend/src/middleware/includedFieldsMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/includedFieldsMiddleware.js rename to backend/src/middleware/includedFieldsMiddleware.js diff --git a/Human-Connection/backend/src/middleware/index.js b/backend/src/middleware/index.js similarity index 100% rename from Human-Connection/backend/src/middleware/index.js rename to backend/src/middleware/index.js diff --git a/Human-Connection/backend/src/middleware/nodes/locations.js b/backend/src/middleware/nodes/locations.js similarity index 100% rename from Human-Connection/backend/src/middleware/nodes/locations.js rename to backend/src/middleware/nodes/locations.js diff --git a/Human-Connection/backend/src/middleware/notifications/extractIds/index.js b/backend/src/middleware/notifications/extractIds/index.js similarity index 100% rename from Human-Connection/backend/src/middleware/notifications/extractIds/index.js rename to backend/src/middleware/notifications/extractIds/index.js diff --git a/Human-Connection/backend/src/middleware/notifications/extractIds/spec.js b/backend/src/middleware/notifications/extractIds/spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/notifications/extractIds/spec.js rename to backend/src/middleware/notifications/extractIds/spec.js diff --git a/Human-Connection/backend/src/middleware/notifications/index.js b/backend/src/middleware/notifications/index.js similarity index 100% rename from Human-Connection/backend/src/middleware/notifications/index.js rename to backend/src/middleware/notifications/index.js diff --git a/Human-Connection/backend/src/middleware/notifications/spec.js b/backend/src/middleware/notifications/spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/notifications/spec.js rename to backend/src/middleware/notifications/spec.js diff --git a/Human-Connection/backend/src/middleware/orderByMiddleware.js b/backend/src/middleware/orderByMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/orderByMiddleware.js rename to backend/src/middleware/orderByMiddleware.js diff --git a/Human-Connection/backend/src/middleware/orderByMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/orderByMiddleware.spec.js rename to backend/src/middleware/orderByMiddleware.spec.js diff --git a/Human-Connection/backend/src/middleware/passwordMiddleware.js b/backend/src/middleware/passwordMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/passwordMiddleware.js rename to backend/src/middleware/passwordMiddleware.js diff --git a/Human-Connection/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/permissionsMiddleware.js rename to backend/src/middleware/permissionsMiddleware.js diff --git a/Human-Connection/backend/src/middleware/permissionsMiddleware.spec.js b/backend/src/middleware/permissionsMiddleware.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/permissionsMiddleware.spec.js rename to backend/src/middleware/permissionsMiddleware.spec.js diff --git a/Human-Connection/backend/src/middleware/sluggifyMiddleware.js b/backend/src/middleware/sluggifyMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/sluggifyMiddleware.js rename to backend/src/middleware/sluggifyMiddleware.js diff --git a/Human-Connection/backend/src/middleware/slugify/uniqueSlug.js b/backend/src/middleware/slugify/uniqueSlug.js similarity index 100% rename from Human-Connection/backend/src/middleware/slugify/uniqueSlug.js rename to backend/src/middleware/slugify/uniqueSlug.js diff --git a/Human-Connection/backend/src/middleware/slugify/uniqueSlug.spec.js b/backend/src/middleware/slugify/uniqueSlug.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/slugify/uniqueSlug.spec.js rename to backend/src/middleware/slugify/uniqueSlug.spec.js diff --git a/Human-Connection/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/slugifyMiddleware.spec.js rename to backend/src/middleware/slugifyMiddleware.spec.js diff --git a/Human-Connection/backend/src/middleware/softDeleteMiddleware.js b/backend/src/middleware/softDeleteMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/softDeleteMiddleware.js rename to backend/src/middleware/softDeleteMiddleware.js diff --git a/Human-Connection/backend/src/middleware/softDeleteMiddleware.spec.js b/backend/src/middleware/softDeleteMiddleware.spec.js similarity index 100% rename from Human-Connection/backend/src/middleware/softDeleteMiddleware.spec.js rename to backend/src/middleware/softDeleteMiddleware.spec.js diff --git a/Human-Connection/backend/src/middleware/userMiddleware.js b/backend/src/middleware/userMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/userMiddleware.js rename to backend/src/middleware/userMiddleware.js diff --git a/Human-Connection/backend/src/middleware/validation/index.js b/backend/src/middleware/validation/index.js similarity index 100% rename from Human-Connection/backend/src/middleware/validation/index.js rename to backend/src/middleware/validation/index.js diff --git a/Human-Connection/backend/src/middleware/xssMiddleware.js b/backend/src/middleware/xssMiddleware.js similarity index 100% rename from Human-Connection/backend/src/middleware/xssMiddleware.js rename to backend/src/middleware/xssMiddleware.js diff --git a/Human-Connection/backend/src/mocks/index.js b/backend/src/mocks/index.js similarity index 100% rename from Human-Connection/backend/src/mocks/index.js rename to backend/src/mocks/index.js diff --git a/Human-Connection/backend/src/schema/index.js b/backend/src/schema/index.js similarity index 100% rename from Human-Connection/backend/src/schema/index.js rename to backend/src/schema/index.js diff --git a/Human-Connection/backend/src/schema/resolvers/badges.spec.js b/backend/src/schema/resolvers/badges.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/badges.spec.js rename to backend/src/schema/resolvers/badges.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/comments.js rename to backend/src/schema/resolvers/comments.js diff --git a/Human-Connection/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/comments.spec.js rename to backend/src/schema/resolvers/comments.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/fileUpload/index.js b/backend/src/schema/resolvers/fileUpload/index.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/fileUpload/index.js rename to backend/src/schema/resolvers/fileUpload/index.js diff --git a/Human-Connection/backend/src/schema/resolvers/fileUpload/spec.js b/backend/src/schema/resolvers/fileUpload/spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/fileUpload/spec.js rename to backend/src/schema/resolvers/fileUpload/spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/follow.js b/backend/src/schema/resolvers/follow.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/follow.js rename to backend/src/schema/resolvers/follow.js diff --git a/Human-Connection/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/follow.spec.js rename to backend/src/schema/resolvers/follow.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/index.js b/backend/src/schema/resolvers/index.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/index.js rename to backend/src/schema/resolvers/index.js diff --git a/Human-Connection/backend/src/schema/resolvers/moderation.js b/backend/src/schema/resolvers/moderation.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/moderation.js rename to backend/src/schema/resolvers/moderation.js diff --git a/Human-Connection/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/moderation.spec.js rename to backend/src/schema/resolvers/moderation.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/notifications.js b/backend/src/schema/resolvers/notifications.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/notifications.js rename to backend/src/schema/resolvers/notifications.js diff --git a/Human-Connection/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/notifications.spec.js rename to backend/src/schema/resolvers/notifications.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/passwordReset.js rename to backend/src/schema/resolvers/passwordReset.js diff --git a/Human-Connection/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/passwordReset.spec.js rename to backend/src/schema/resolvers/passwordReset.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/passwordReset/emailTemplates.js b/backend/src/schema/resolvers/passwordReset/emailTemplates.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/passwordReset/emailTemplates.js rename to backend/src/schema/resolvers/passwordReset/emailTemplates.js diff --git a/Human-Connection/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/posts.js rename to backend/src/schema/resolvers/posts.js diff --git a/Human-Connection/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/posts.spec.js rename to backend/src/schema/resolvers/posts.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/reports.js rename to backend/src/schema/resolvers/reports.js diff --git a/Human-Connection/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/reports.spec.js rename to backend/src/schema/resolvers/reports.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/rewards.js b/backend/src/schema/resolvers/rewards.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/rewards.js rename to backend/src/schema/resolvers/rewards.js diff --git a/Human-Connection/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/rewards.spec.js rename to backend/src/schema/resolvers/rewards.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/shout.js b/backend/src/schema/resolvers/shout.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/shout.js rename to backend/src/schema/resolvers/shout.js diff --git a/Human-Connection/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/shout.spec.js rename to backend/src/schema/resolvers/shout.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/socialMedia.js b/backend/src/schema/resolvers/socialMedia.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/socialMedia.js rename to backend/src/schema/resolvers/socialMedia.js diff --git a/Human-Connection/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/socialMedia.spec.js rename to backend/src/schema/resolvers/socialMedia.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/statistics.js b/backend/src/schema/resolvers/statistics.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/statistics.js rename to backend/src/schema/resolvers/statistics.js diff --git a/Human-Connection/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/user_management.js rename to backend/src/schema/resolvers/user_management.js diff --git a/Human-Connection/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/user_management.spec.js rename to backend/src/schema/resolvers/user_management.spec.js diff --git a/Human-Connection/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/users.js rename to backend/src/schema/resolvers/users.js diff --git a/Human-Connection/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js similarity index 100% rename from Human-Connection/backend/src/schema/resolvers/users.spec.js rename to backend/src/schema/resolvers/users.spec.js diff --git a/Human-Connection/backend/src/schema/types/enum/BadgeStatus.gql b/backend/src/schema/types/enum/BadgeStatus.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/enum/BadgeStatus.gql rename to backend/src/schema/types/enum/BadgeStatus.gql diff --git a/Human-Connection/backend/src/schema/types/enum/BadgeType.gql b/backend/src/schema/types/enum/BadgeType.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/enum/BadgeType.gql rename to backend/src/schema/types/enum/BadgeType.gql diff --git a/Human-Connection/backend/src/schema/types/enum/UserGroup.gql b/backend/src/schema/types/enum/UserGroup.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/enum/UserGroup.gql rename to backend/src/schema/types/enum/UserGroup.gql diff --git a/Human-Connection/backend/src/schema/types/enum/Visibility.gql b/backend/src/schema/types/enum/Visibility.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/enum/Visibility.gql rename to backend/src/schema/types/enum/Visibility.gql diff --git a/Human-Connection/backend/src/schema/types/index.js b/backend/src/schema/types/index.js similarity index 100% rename from Human-Connection/backend/src/schema/types/index.js rename to backend/src/schema/types/index.js diff --git a/Human-Connection/backend/src/schema/types/scalar/Date.gql_ b/backend/src/schema/types/scalar/Date.gql_ similarity index 100% rename from Human-Connection/backend/src/schema/types/scalar/Date.gql_ rename to backend/src/schema/types/scalar/Date.gql_ diff --git a/Human-Connection/backend/src/schema/types/scalar/DateTime.gql_ b/backend/src/schema/types/scalar/DateTime.gql_ similarity index 100% rename from Human-Connection/backend/src/schema/types/scalar/DateTime.gql_ rename to backend/src/schema/types/scalar/DateTime.gql_ diff --git a/Human-Connection/backend/src/schema/types/scalar/Time.gql_ b/backend/src/schema/types/scalar/Time.gql_ similarity index 100% rename from Human-Connection/backend/src/schema/types/scalar/Time.gql_ rename to backend/src/schema/types/scalar/Time.gql_ diff --git a/Human-Connection/backend/src/schema/types/scalar/Upload.gql b/backend/src/schema/types/scalar/Upload.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/scalar/Upload.gql rename to backend/src/schema/types/scalar/Upload.gql diff --git a/Human-Connection/backend/src/schema/types/schema.gql b/backend/src/schema/types/schema.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/schema.gql rename to backend/src/schema/types/schema.gql diff --git a/Human-Connection/backend/src/schema/types/schema_full.gql_ b/backend/src/schema/types/schema_full.gql_ similarity index 100% rename from Human-Connection/backend/src/schema/types/schema_full.gql_ rename to backend/src/schema/types/schema_full.gql_ diff --git a/Human-Connection/backend/src/schema/types/type/Badge.gql b/backend/src/schema/types/type/Badge.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/Badge.gql rename to backend/src/schema/types/type/Badge.gql diff --git a/Human-Connection/backend/src/schema/types/type/Category.gql b/backend/src/schema/types/type/Category.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/Category.gql rename to backend/src/schema/types/type/Category.gql diff --git a/Human-Connection/backend/src/schema/types/type/Comment.gql b/backend/src/schema/types/type/Comment.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/Comment.gql rename to backend/src/schema/types/type/Comment.gql diff --git a/Human-Connection/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/Post.gql rename to backend/src/schema/types/type/Post.gql diff --git a/Human-Connection/backend/src/schema/types/type/Tag.gql b/backend/src/schema/types/type/Tag.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/Tag.gql rename to backend/src/schema/types/type/Tag.gql diff --git a/Human-Connection/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql similarity index 100% rename from Human-Connection/backend/src/schema/types/type/User.gql rename to backend/src/schema/types/type/User.gql diff --git a/Human-Connection/backend/src/seed/factories/badges.js b/backend/src/seed/factories/badges.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/badges.js rename to backend/src/seed/factories/badges.js diff --git a/Human-Connection/backend/src/seed/factories/categories.js b/backend/src/seed/factories/categories.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/categories.js rename to backend/src/seed/factories/categories.js diff --git a/Human-Connection/backend/src/seed/factories/comments.js b/backend/src/seed/factories/comments.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/comments.js rename to backend/src/seed/factories/comments.js diff --git a/Human-Connection/backend/src/seed/factories/index.js b/backend/src/seed/factories/index.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/index.js rename to backend/src/seed/factories/index.js diff --git a/Human-Connection/backend/src/seed/factories/notifications.js b/backend/src/seed/factories/notifications.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/notifications.js rename to backend/src/seed/factories/notifications.js diff --git a/Human-Connection/backend/src/seed/factories/organizations.js b/backend/src/seed/factories/organizations.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/organizations.js rename to backend/src/seed/factories/organizations.js diff --git a/Human-Connection/backend/src/seed/factories/posts.js b/backend/src/seed/factories/posts.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/posts.js rename to backend/src/seed/factories/posts.js diff --git a/Human-Connection/backend/src/seed/factories/reports.js b/backend/src/seed/factories/reports.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/reports.js rename to backend/src/seed/factories/reports.js diff --git a/Human-Connection/backend/src/seed/factories/tags.js b/backend/src/seed/factories/tags.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/tags.js rename to backend/src/seed/factories/tags.js diff --git a/Human-Connection/backend/src/seed/factories/users.js b/backend/src/seed/factories/users.js similarity index 100% rename from Human-Connection/backend/src/seed/factories/users.js rename to backend/src/seed/factories/users.js diff --git a/Human-Connection/backend/src/seed/reset-db.js b/backend/src/seed/reset-db.js similarity index 100% rename from Human-Connection/backend/src/seed/reset-db.js rename to backend/src/seed/reset-db.js diff --git a/Human-Connection/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js similarity index 100% rename from Human-Connection/backend/src/seed/seed-db.js rename to backend/src/seed/seed-db.js diff --git a/Human-Connection/backend/src/seed/seed-helpers.js b/backend/src/seed/seed-helpers.js similarity index 100% rename from Human-Connection/backend/src/seed/seed-helpers.js rename to backend/src/seed/seed-helpers.js diff --git a/Human-Connection/backend/src/server.js b/backend/src/server.js similarity index 100% rename from Human-Connection/backend/src/server.js rename to backend/src/server.js diff --git a/Human-Connection/backend/test/features/activity-delete.feature b/backend/test/features/activity-delete.feature similarity index 100% rename from Human-Connection/backend/test/features/activity-delete.feature rename to backend/test/features/activity-delete.feature diff --git a/Human-Connection/backend/test/features/activity-follow.feature b/backend/test/features/activity-follow.feature similarity index 100% rename from Human-Connection/backend/test/features/activity-follow.feature rename to backend/test/features/activity-follow.feature diff --git a/Human-Connection/backend/test/features/activity-like.feature b/backend/test/features/activity-like.feature similarity index 100% rename from Human-Connection/backend/test/features/activity-like.feature rename to backend/test/features/activity-like.feature diff --git a/Human-Connection/backend/test/features/collection.feature b/backend/test/features/collection.feature similarity index 100% rename from Human-Connection/backend/test/features/collection.feature rename to backend/test/features/collection.feature diff --git a/Human-Connection/backend/test/features/object-article.feature b/backend/test/features/object-article.feature similarity index 100% rename from Human-Connection/backend/test/features/object-article.feature rename to backend/test/features/object-article.feature diff --git a/Human-Connection/backend/test/features/support/steps.js b/backend/test/features/support/steps.js similarity index 100% rename from Human-Connection/backend/test/features/support/steps.js rename to backend/test/features/support/steps.js diff --git a/Human-Connection/backend/test/features/webfinger.feature b/backend/test/features/webfinger.feature similarity index 100% rename from Human-Connection/backend/test/features/webfinger.feature rename to backend/test/features/webfinger.feature diff --git a/Human-Connection/backend/test/features/world.js b/backend/test/features/world.js similarity index 100% rename from Human-Connection/backend/test/features/world.js rename to backend/test/features/world.js diff --git a/Human-Connection/backend/testing.md b/backend/testing.md similarity index 100% rename from Human-Connection/backend/testing.md rename to backend/testing.md diff --git a/Human-Connection/backend/yarn.lock b/backend/yarn.lock similarity index 100% rename from Human-Connection/backend/yarn.lock rename to backend/yarn.lock diff --git a/Human-Connection/cypress.env.template.json b/cypress.env.template.json similarity index 100% rename from Human-Connection/cypress.env.template.json rename to cypress.env.template.json diff --git a/Human-Connection/cypress.json b/cypress.json similarity index 100% rename from Human-Connection/cypress.json rename to cypress.json diff --git a/Human-Connection/cypress/README.md b/cypress/README.md similarity index 100% rename from Human-Connection/cypress/README.md rename to cypress/README.md diff --git a/Human-Connection/cypress/features.md b/cypress/features.md similarity index 100% rename from Human-Connection/cypress/features.md rename to cypress/features.md diff --git a/Human-Connection/cypress/fixtures/example.json b/cypress/fixtures/example.json similarity index 100% rename from Human-Connection/cypress/fixtures/example.json rename to cypress/fixtures/example.json diff --git a/Human-Connection/cypress/fixtures/onourjourney.png b/cypress/fixtures/onourjourney.png similarity index 100% rename from Human-Connection/cypress/fixtures/onourjourney.png rename to cypress/fixtures/onourjourney.png diff --git a/Human-Connection/cypress/fixtures/users.json b/cypress/fixtures/users.json similarity index 100% rename from Human-Connection/cypress/fixtures/users.json rename to cypress/fixtures/users.json diff --git a/Human-Connection/cypress/integration/administration/TagsAndCategories.feature b/cypress/integration/administration/TagsAndCategories.feature similarity index 100% rename from Human-Connection/cypress/integration/administration/TagsAndCategories.feature rename to cypress/integration/administration/TagsAndCategories.feature diff --git a/Human-Connection/cypress/integration/common/admin.js b/cypress/integration/common/admin.js similarity index 100% rename from Human-Connection/cypress/integration/common/admin.js rename to cypress/integration/common/admin.js diff --git a/Human-Connection/cypress/integration/common/post.js b/cypress/integration/common/post.js similarity index 100% rename from Human-Connection/cypress/integration/common/post.js rename to cypress/integration/common/post.js diff --git a/Human-Connection/cypress/integration/common/profile.js b/cypress/integration/common/profile.js similarity index 100% rename from Human-Connection/cypress/integration/common/profile.js rename to cypress/integration/common/profile.js diff --git a/Human-Connection/cypress/integration/common/report.js b/cypress/integration/common/report.js similarity index 100% rename from Human-Connection/cypress/integration/common/report.js rename to cypress/integration/common/report.js diff --git a/Human-Connection/cypress/integration/common/search.js b/cypress/integration/common/search.js similarity index 100% rename from Human-Connection/cypress/integration/common/search.js rename to cypress/integration/common/search.js diff --git a/Human-Connection/cypress/integration/common/settings.js b/cypress/integration/common/settings.js similarity index 100% rename from Human-Connection/cypress/integration/common/settings.js rename to cypress/integration/common/settings.js diff --git a/Human-Connection/cypress/integration/common/steps.js b/cypress/integration/common/steps.js similarity index 100% rename from Human-Connection/cypress/integration/common/steps.js rename to cypress/integration/common/steps.js diff --git a/Human-Connection/cypress/integration/internationalization/Internationalization.feature b/cypress/integration/internationalization/Internationalization.feature similarity index 100% rename from Human-Connection/cypress/integration/internationalization/Internationalization.feature rename to cypress/integration/internationalization/Internationalization.feature diff --git a/Human-Connection/cypress/integration/moderation/HidePosts.feature b/cypress/integration/moderation/HidePosts.feature similarity index 100% rename from Human-Connection/cypress/integration/moderation/HidePosts.feature rename to cypress/integration/moderation/HidePosts.feature diff --git a/Human-Connection/cypress/integration/moderation/ReportContent.feature b/cypress/integration/moderation/ReportContent.feature similarity index 100% rename from Human-Connection/cypress/integration/moderation/ReportContent.feature rename to cypress/integration/moderation/ReportContent.feature diff --git a/Human-Connection/cypress/integration/notifications/Mentions.feature b/cypress/integration/notifications/Mentions.feature similarity index 100% rename from Human-Connection/cypress/integration/notifications/Mentions.feature rename to cypress/integration/notifications/Mentions.feature diff --git a/Human-Connection/cypress/integration/post/Comment.feature b/cypress/integration/post/Comment.feature similarity index 100% rename from Human-Connection/cypress/integration/post/Comment.feature rename to cypress/integration/post/Comment.feature diff --git a/Human-Connection/cypress/integration/post/PersistentLinks.feature b/cypress/integration/post/PersistentLinks.feature similarity index 100% rename from Human-Connection/cypress/integration/post/PersistentLinks.feature rename to cypress/integration/post/PersistentLinks.feature diff --git a/Human-Connection/cypress/integration/post/WritePost.feature b/cypress/integration/post/WritePost.feature similarity index 100% rename from Human-Connection/cypress/integration/post/WritePost.feature rename to cypress/integration/post/WritePost.feature diff --git a/Human-Connection/cypress/integration/search/Search.feature b/cypress/integration/search/Search.feature similarity index 100% rename from Human-Connection/cypress/integration/search/Search.feature rename to cypress/integration/search/Search.feature diff --git a/Human-Connection/cypress/integration/user_account/ChangePassword.feature b/cypress/integration/user_account/ChangePassword.feature similarity index 100% rename from Human-Connection/cypress/integration/user_account/ChangePassword.feature rename to cypress/integration/user_account/ChangePassword.feature diff --git a/Human-Connection/cypress/integration/user_account/Login.feature b/cypress/integration/user_account/Login.feature similarity index 100% rename from Human-Connection/cypress/integration/user_account/Login.feature rename to cypress/integration/user_account/Login.feature diff --git a/Human-Connection/cypress/integration/user_profile/AboutMeAndLocation.feature b/cypress/integration/user_profile/AboutMeAndLocation.feature similarity index 100% rename from Human-Connection/cypress/integration/user_profile/AboutMeAndLocation.feature rename to cypress/integration/user_profile/AboutMeAndLocation.feature diff --git a/Human-Connection/cypress/integration/user_profile/SocialMedia.feature b/cypress/integration/user_profile/SocialMedia.feature similarity index 100% rename from Human-Connection/cypress/integration/user_profile/SocialMedia.feature rename to cypress/integration/user_profile/SocialMedia.feature diff --git a/Human-Connection/cypress/integration/user_profile/UploadUserProfileImage.feature b/cypress/integration/user_profile/UploadUserProfileImage.feature similarity index 100% rename from Human-Connection/cypress/integration/user_profile/UploadUserProfileImage.feature rename to cypress/integration/user_profile/UploadUserProfileImage.feature diff --git a/Human-Connection/cypress/plugins/index.js b/cypress/plugins/index.js similarity index 100% rename from Human-Connection/cypress/plugins/index.js rename to cypress/plugins/index.js diff --git a/Human-Connection/cypress/support/commands.js b/cypress/support/commands.js similarity index 100% rename from Human-Connection/cypress/support/commands.js rename to cypress/support/commands.js diff --git a/Human-Connection/cypress/support/factories.js b/cypress/support/factories.js similarity index 100% rename from Human-Connection/cypress/support/factories.js rename to cypress/support/factories.js diff --git a/Human-Connection/cypress/support/helpers.js b/cypress/support/helpers.js similarity index 100% rename from Human-Connection/cypress/support/helpers.js rename to cypress/support/helpers.js diff --git a/Human-Connection/cypress/support/index.js b/cypress/support/index.js similarity index 100% rename from Human-Connection/cypress/support/index.js rename to cypress/support/index.js diff --git a/Human-Connection/deployment/.gitignore b/deployment/.gitignore similarity index 100% rename from Human-Connection/deployment/.gitignore rename to deployment/.gitignore diff --git a/Human-Connection/deployment/README.md b/deployment/README.md similarity index 100% rename from Human-Connection/deployment/README.md rename to deployment/README.md diff --git a/Human-Connection/deployment/digital-ocean/README.md b/deployment/digital-ocean/README.md similarity index 100% rename from Human-Connection/deployment/digital-ocean/README.md rename to deployment/digital-ocean/README.md diff --git a/Human-Connection/deployment/digital-ocean/dashboard/README.md b/deployment/digital-ocean/dashboard/README.md similarity index 100% rename from Human-Connection/deployment/digital-ocean/dashboard/README.md rename to deployment/digital-ocean/dashboard/README.md diff --git a/Human-Connection/deployment/digital-ocean/dashboard/admin-user.yaml b/deployment/digital-ocean/dashboard/admin-user.yaml similarity index 100% rename from Human-Connection/deployment/digital-ocean/dashboard/admin-user.yaml rename to deployment/digital-ocean/dashboard/admin-user.yaml diff --git a/Human-Connection/deployment/digital-ocean/dashboard/dashboard-screenshot.png b/deployment/digital-ocean/dashboard/dashboard-screenshot.png similarity index 100% rename from Human-Connection/deployment/digital-ocean/dashboard/dashboard-screenshot.png rename to deployment/digital-ocean/dashboard/dashboard-screenshot.png diff --git a/Human-Connection/deployment/digital-ocean/dashboard/role-binding.yaml b/deployment/digital-ocean/dashboard/role-binding.yaml similarity index 100% rename from Human-Connection/deployment/digital-ocean/dashboard/role-binding.yaml rename to deployment/digital-ocean/dashboard/role-binding.yaml diff --git a/Human-Connection/deployment/digital-ocean/https/.gitignore b/deployment/digital-ocean/https/.gitignore similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/.gitignore rename to deployment/digital-ocean/https/.gitignore diff --git a/Human-Connection/deployment/digital-ocean/https/README.md b/deployment/digital-ocean/https/README.md similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/README.md rename to deployment/digital-ocean/https/README.md diff --git a/Human-Connection/deployment/digital-ocean/https/ip-address.png b/deployment/digital-ocean/https/ip-address.png similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/ip-address.png rename to deployment/digital-ocean/https/ip-address.png diff --git a/Human-Connection/deployment/digital-ocean/https/namespace.yaml b/deployment/digital-ocean/https/namespace.yaml similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/namespace.yaml rename to deployment/digital-ocean/https/namespace.yaml diff --git a/Human-Connection/deployment/digital-ocean/https/templates/ingress.template.yaml b/deployment/digital-ocean/https/templates/ingress.template.yaml similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/templates/ingress.template.yaml rename to deployment/digital-ocean/https/templates/ingress.template.yaml diff --git a/Human-Connection/deployment/digital-ocean/https/templates/issuer.template.yaml b/deployment/digital-ocean/https/templates/issuer.template.yaml similarity index 100% rename from Human-Connection/deployment/digital-ocean/https/templates/issuer.template.yaml rename to deployment/digital-ocean/https/templates/issuer.template.yaml diff --git a/Human-Connection/deployment/human-connection/README.md b/deployment/human-connection/README.md similarity index 100% rename from Human-Connection/deployment/human-connection/README.md rename to deployment/human-connection/README.md diff --git a/Human-Connection/deployment/human-connection/deployment-backend.yaml b/deployment/human-connection/deployment-backend.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/deployment-backend.yaml rename to deployment/human-connection/deployment-backend.yaml diff --git a/Human-Connection/deployment/human-connection/deployment-neo4j.yaml b/deployment/human-connection/deployment-neo4j.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/deployment-neo4j.yaml rename to deployment/human-connection/deployment-neo4j.yaml diff --git a/Human-Connection/deployment/human-connection/deployment-web.yaml b/deployment/human-connection/deployment-web.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/deployment-web.yaml rename to deployment/human-connection/deployment-web.yaml diff --git a/Human-Connection/deployment/human-connection/mailserver/README.md b/deployment/human-connection/mailserver/README.md similarity index 100% rename from Human-Connection/deployment/human-connection/mailserver/README.md rename to deployment/human-connection/mailserver/README.md diff --git a/Human-Connection/deployment/human-connection/mailserver/deployment-mailserver.yaml b/deployment/human-connection/mailserver/deployment-mailserver.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/mailserver/deployment-mailserver.yaml rename to deployment/human-connection/mailserver/deployment-mailserver.yaml diff --git a/Human-Connection/deployment/human-connection/mailserver/service-mailserver.yaml b/deployment/human-connection/mailserver/service-mailserver.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/mailserver/service-mailserver.yaml rename to deployment/human-connection/mailserver/service-mailserver.yaml diff --git a/Human-Connection/deployment/human-connection/service-backend.yaml b/deployment/human-connection/service-backend.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/service-backend.yaml rename to deployment/human-connection/service-backend.yaml diff --git a/Human-Connection/deployment/human-connection/service-neo4j.yaml b/deployment/human-connection/service-neo4j.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/service-neo4j.yaml rename to deployment/human-connection/service-neo4j.yaml diff --git a/Human-Connection/deployment/human-connection/service-web.yaml b/deployment/human-connection/service-web.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/service-web.yaml rename to deployment/human-connection/service-web.yaml diff --git a/Human-Connection/deployment/human-connection/templates/configmap.template.yaml b/deployment/human-connection/templates/configmap.template.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/templates/configmap.template.yaml rename to deployment/human-connection/templates/configmap.template.yaml diff --git a/Human-Connection/deployment/human-connection/templates/secrets.template.yaml b/deployment/human-connection/templates/secrets.template.yaml similarity index 100% rename from Human-Connection/deployment/human-connection/templates/secrets.template.yaml rename to deployment/human-connection/templates/secrets.template.yaml diff --git a/Human-Connection/deployment/legacy-migration/README.md b/deployment/legacy-migration/README.md similarity index 100% rename from Human-Connection/deployment/legacy-migration/README.md rename to deployment/legacy-migration/README.md diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker.yaml b/deployment/legacy-migration/maintenance-worker.yaml similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker.yaml rename to deployment/legacy-migration/maintenance-worker.yaml diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/.dockerignore b/deployment/legacy-migration/maintenance-worker/.dockerignore similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/.dockerignore rename to deployment/legacy-migration/maintenance-worker/.dockerignore diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/.gitignore b/deployment/legacy-migration/maintenance-worker/.gitignore similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/.gitignore rename to deployment/legacy-migration/maintenance-worker/.gitignore diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/Dockerfile b/deployment/legacy-migration/maintenance-worker/Dockerfile similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/Dockerfile rename to deployment/legacy-migration/maintenance-worker/Dockerfile diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/idle b/deployment/legacy-migration/maintenance-worker/binaries/idle similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/idle rename to deployment/legacy-migration/maintenance-worker/binaries/idle diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_db b/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_db similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_db rename to deployment/legacy-migration/maintenance-worker/binaries/import_legacy_db diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_uploads b/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_uploads similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/binaries/import_legacy_uploads rename to deployment/legacy-migration/maintenance-worker/binaries/import_legacy_uploads diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/known_hosts b/deployment/legacy-migration/maintenance-worker/known_hosts similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/known_hosts rename to deployment/legacy-migration/maintenance-worker/known_hosts diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/export.sh b/deployment/legacy-migration/maintenance-worker/migration/mongo/export.sh similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/mongo/export.sh rename to deployment/legacy-migration/maintenance-worker/migration/mongo/export.sh diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/categories.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/categories/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/comments.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/comments/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/contributions.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/contributions/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/delete_all.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/emotions/emotions.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/follows/follows.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/import.sh b/deployment/legacy-migration/maintenance-worker/migration/neo4j/import.sh similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/import.sh rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/import.sh diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/invites/invites.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/notifications/notifications.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/organizations/organizations.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/pages/pages.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/projects/projects.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/settings/settings.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/shouts/shouts.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/status/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/status/status.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/systemnotifications/systemnotifications.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/users/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/userscandos/userscandos.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/delete.cql diff --git a/Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql similarity index 100% rename from Human-Connection/deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql rename to deployment/legacy-migration/maintenance-worker/migration/neo4j/usersettings/usersettings.cql diff --git a/Human-Connection/deployment/minikube/README.md b/deployment/minikube/README.md similarity index 100% rename from Human-Connection/deployment/minikube/README.md rename to deployment/minikube/README.md diff --git a/Human-Connection/deployment/namespace.yaml b/deployment/namespace.yaml similarity index 100% rename from Human-Connection/deployment/namespace.yaml rename to deployment/namespace.yaml diff --git a/Human-Connection/deployment/volumes/README.md b/deployment/volumes/README.md similarity index 100% rename from Human-Connection/deployment/volumes/README.md rename to deployment/volumes/README.md diff --git a/Human-Connection/deployment/volumes/neo4j-data.yaml b/deployment/volumes/neo4j-data.yaml similarity index 100% rename from Human-Connection/deployment/volumes/neo4j-data.yaml rename to deployment/volumes/neo4j-data.yaml diff --git a/Human-Connection/deployment/volumes/neo4j-offline-backup/README.md b/deployment/volumes/neo4j-offline-backup/README.md similarity index 100% rename from Human-Connection/deployment/volumes/neo4j-offline-backup/README.md rename to deployment/volumes/neo4j-offline-backup/README.md diff --git a/Human-Connection/deployment/volumes/reclaim-policy/README.md b/deployment/volumes/reclaim-policy/README.md similarity index 100% rename from Human-Connection/deployment/volumes/reclaim-policy/README.md rename to deployment/volumes/reclaim-policy/README.md diff --git a/Human-Connection/deployment/volumes/uploads.yaml b/deployment/volumes/uploads.yaml similarity index 100% rename from Human-Connection/deployment/volumes/uploads.yaml rename to deployment/volumes/uploads.yaml diff --git a/Human-Connection/deployment/volumes/velero/README.md b/deployment/volumes/velero/README.md similarity index 100% rename from Human-Connection/deployment/volumes/velero/README.md rename to deployment/volumes/velero/README.md diff --git a/Human-Connection/deployment/volumes/volume-snapshots/README.md b/deployment/volumes/volume-snapshots/README.md similarity index 100% rename from Human-Connection/deployment/volumes/volume-snapshots/README.md rename to deployment/volumes/volume-snapshots/README.md diff --git a/Human-Connection/deployment/volumes/volume-snapshots/digital-ocean-volume-snapshots.png b/deployment/volumes/volume-snapshots/digital-ocean-volume-snapshots.png similarity index 100% rename from Human-Connection/deployment/volumes/volume-snapshots/digital-ocean-volume-snapshots.png rename to deployment/volumes/volume-snapshots/digital-ocean-volume-snapshots.png diff --git a/Human-Connection/deployment/volumes/volume-snapshots/neo4j-data.yaml b/deployment/volumes/volume-snapshots/neo4j-data.yaml similarity index 100% rename from Human-Connection/deployment/volumes/volume-snapshots/neo4j-data.yaml rename to deployment/volumes/volume-snapshots/neo4j-data.yaml diff --git a/Human-Connection/deployment/volumes/volume-snapshots/snapshot.yaml b/deployment/volumes/volume-snapshots/snapshot.yaml similarity index 100% rename from Human-Connection/deployment/volumes/volume-snapshots/snapshot.yaml rename to deployment/volumes/volume-snapshots/snapshot.yaml diff --git a/Human-Connection/docker-compose.maintenance.yml b/docker-compose.maintenance.yml similarity index 100% rename from Human-Connection/docker-compose.maintenance.yml rename to docker-compose.maintenance.yml diff --git a/Human-Connection/docker-compose.override.yml b/docker-compose.override.yml similarity index 100% rename from Human-Connection/docker-compose.override.yml rename to docker-compose.override.yml diff --git a/Human-Connection/docker-compose.travis.yml b/docker-compose.travis.yml similarity index 100% rename from Human-Connection/docker-compose.travis.yml rename to docker-compose.travis.yml diff --git a/Human-Connection/docker-compose.yml b/docker-compose.yml similarity index 100% rename from Human-Connection/docker-compose.yml rename to docker-compose.yml diff --git a/Human-Connection/edit-this-documentation.md b/edit-this-documentation.md similarity index 100% rename from Human-Connection/edit-this-documentation.md rename to edit-this-documentation.md diff --git a/Human-Connection/installation.md b/installation.md similarity index 100% rename from Human-Connection/installation.md rename to installation.md diff --git a/Human-Connection/neo4j/.env.template b/neo4j/.env.template similarity index 100% rename from Human-Connection/neo4j/.env.template rename to neo4j/.env.template diff --git a/Human-Connection/neo4j/.gitignore b/neo4j/.gitignore similarity index 100% rename from Human-Connection/neo4j/.gitignore rename to neo4j/.gitignore diff --git a/Human-Connection/neo4j/Dockerfile b/neo4j/Dockerfile similarity index 100% rename from Human-Connection/neo4j/Dockerfile rename to neo4j/Dockerfile diff --git a/Human-Connection/neo4j/README.md b/neo4j/README.md similarity index 100% rename from Human-Connection/neo4j/README.md rename to neo4j/README.md diff --git a/Human-Connection/neo4j/db_setup.sh b/neo4j/db_setup.sh similarity index 100% rename from Human-Connection/neo4j/db_setup.sh rename to neo4j/db_setup.sh diff --git a/Human-Connection/neo4j/entrypoint.sh b/neo4j/entrypoint.sh similarity index 100% rename from Human-Connection/neo4j/entrypoint.sh rename to neo4j/entrypoint.sh diff --git a/Human-Connection/package.json b/package.json similarity index 100% rename from Human-Connection/package.json rename to package.json diff --git a/Human-Connection/scripts/deploy.sh b/scripts/deploy.sh similarity index 100% rename from Human-Connection/scripts/deploy.sh rename to scripts/deploy.sh diff --git a/Human-Connection/scripts/docker_push.sh b/scripts/docker_push.sh similarity index 100% rename from Human-Connection/scripts/docker_push.sh rename to scripts/docker_push.sh diff --git a/Human-Connection/scripts/patch-deployment.yaml b/scripts/patch-deployment.yaml similarity index 100% rename from Human-Connection/scripts/patch-deployment.yaml rename to scripts/patch-deployment.yaml diff --git a/Human-Connection/scripts/setup_kubernetes.sh b/scripts/setup_kubernetes.sh similarity index 100% rename from Human-Connection/scripts/setup_kubernetes.sh rename to scripts/setup_kubernetes.sh diff --git a/Human-Connection/testing.md b/testing.md similarity index 100% rename from Human-Connection/testing.md rename to testing.md diff --git a/Human-Connection/webapp/.babelrc b/webapp/.babelrc similarity index 100% rename from Human-Connection/webapp/.babelrc rename to webapp/.babelrc diff --git a/Human-Connection/webapp/.dockerignore b/webapp/.dockerignore similarity index 100% rename from Human-Connection/webapp/.dockerignore rename to webapp/.dockerignore diff --git a/Human-Connection/webapp/.editorconfig b/webapp/.editorconfig similarity index 100% rename from Human-Connection/webapp/.editorconfig rename to webapp/.editorconfig diff --git a/Human-Connection/webapp/.env.template b/webapp/.env.template similarity index 100% rename from Human-Connection/webapp/.env.template rename to webapp/.env.template diff --git a/Human-Connection/webapp/.eslintignore b/webapp/.eslintignore similarity index 100% rename from Human-Connection/webapp/.eslintignore rename to webapp/.eslintignore diff --git a/Human-Connection/webapp/.eslintrc.js b/webapp/.eslintrc.js similarity index 100% rename from Human-Connection/webapp/.eslintrc.js rename to webapp/.eslintrc.js diff --git a/Human-Connection/webapp/.gitignore b/webapp/.gitignore similarity index 100% rename from Human-Connection/webapp/.gitignore rename to webapp/.gitignore diff --git a/Human-Connection/webapp/.prettierrc.js b/webapp/.prettierrc.js similarity index 100% rename from Human-Connection/webapp/.prettierrc.js rename to webapp/.prettierrc.js diff --git a/Human-Connection/webapp/Dockerfile b/webapp/Dockerfile similarity index 100% rename from Human-Connection/webapp/Dockerfile rename to webapp/Dockerfile diff --git a/Human-Connection/webapp/README.md b/webapp/README.md similarity index 100% rename from Human-Connection/webapp/README.md rename to webapp/README.md diff --git a/Human-Connection/webapp/assets.md b/webapp/assets.md similarity index 100% rename from Human-Connection/webapp/assets.md rename to webapp/assets.md diff --git a/Human-Connection/webapp/assets/styles/imports/_toast.scss b/webapp/assets/styles/imports/_toast.scss similarity index 100% rename from Human-Connection/webapp/assets/styles/imports/_toast.scss rename to webapp/assets/styles/imports/_toast.scss diff --git a/Human-Connection/webapp/assets/styles/imports/_tooltip.scss b/webapp/assets/styles/imports/_tooltip.scss similarity index 100% rename from Human-Connection/webapp/assets/styles/imports/_tooltip.scss rename to webapp/assets/styles/imports/_tooltip.scss diff --git a/Human-Connection/webapp/assets/styles/main.scss b/webapp/assets/styles/main.scss similarity index 100% rename from Human-Connection/webapp/assets/styles/main.scss rename to webapp/assets/styles/main.scss diff --git a/Human-Connection/webapp/components.md b/webapp/components.md similarity index 100% rename from Human-Connection/webapp/components.md rename to webapp/components.md diff --git a/Human-Connection/webapp/components/Avatar/Avatar.spec.js b/webapp/components/Avatar/Avatar.spec.js similarity index 100% rename from Human-Connection/webapp/components/Avatar/Avatar.spec.js rename to webapp/components/Avatar/Avatar.spec.js diff --git a/Human-Connection/webapp/components/Avatar/Avatar.vue b/webapp/components/Avatar/Avatar.vue similarity index 100% rename from Human-Connection/webapp/components/Avatar/Avatar.vue rename to webapp/components/Avatar/Avatar.vue diff --git a/Human-Connection/webapp/components/Badges.spec.js b/webapp/components/Badges.spec.js similarity index 100% rename from Human-Connection/webapp/components/Badges.spec.js rename to webapp/components/Badges.spec.js diff --git a/Human-Connection/webapp/components/Badges.vue b/webapp/components/Badges.vue similarity index 100% rename from Human-Connection/webapp/components/Badges.vue rename to webapp/components/Badges.vue diff --git a/Human-Connection/webapp/components/CategoriesSelect/CategoriesSelect.spec.js b/webapp/components/CategoriesSelect/CategoriesSelect.spec.js similarity index 100% rename from Human-Connection/webapp/components/CategoriesSelect/CategoriesSelect.spec.js rename to webapp/components/CategoriesSelect/CategoriesSelect.spec.js diff --git a/Human-Connection/webapp/components/CategoriesSelect/CategoriesSelect.vue b/webapp/components/CategoriesSelect/CategoriesSelect.vue similarity index 100% rename from Human-Connection/webapp/components/CategoriesSelect/CategoriesSelect.vue rename to webapp/components/CategoriesSelect/CategoriesSelect.vue diff --git a/Human-Connection/webapp/components/Category/Readme.md b/webapp/components/Category/Readme.md similarity index 100% rename from Human-Connection/webapp/components/Category/Readme.md rename to webapp/components/Category/Readme.md diff --git a/Human-Connection/webapp/components/Category/index.spec.js b/webapp/components/Category/index.spec.js similarity index 100% rename from Human-Connection/webapp/components/Category/index.spec.js rename to webapp/components/Category/index.spec.js diff --git a/Human-Connection/webapp/components/Category/index.vue b/webapp/components/Category/index.vue similarity index 100% rename from Human-Connection/webapp/components/Category/index.vue rename to webapp/components/Category/index.vue diff --git a/Human-Connection/webapp/components/Comment.spec.js b/webapp/components/Comment.spec.js similarity index 100% rename from Human-Connection/webapp/components/Comment.spec.js rename to webapp/components/Comment.spec.js diff --git a/Human-Connection/webapp/components/Comment.vue b/webapp/components/Comment.vue similarity index 100% rename from Human-Connection/webapp/components/Comment.vue rename to webapp/components/Comment.vue diff --git a/Human-Connection/webapp/components/ContentMenu.vue b/webapp/components/ContentMenu.vue similarity index 100% rename from Human-Connection/webapp/components/ContentMenu.vue rename to webapp/components/ContentMenu.vue diff --git a/Human-Connection/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js similarity index 100% rename from Human-Connection/webapp/components/ContributionForm/ContributionForm.spec.js rename to webapp/components/ContributionForm/ContributionForm.spec.js diff --git a/Human-Connection/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue similarity index 100% rename from Human-Connection/webapp/components/ContributionForm/ContributionForm.vue rename to webapp/components/ContributionForm/ContributionForm.vue diff --git a/Human-Connection/webapp/components/CountTo.vue b/webapp/components/CountTo.vue similarity index 100% rename from Human-Connection/webapp/components/CountTo.vue rename to webapp/components/CountTo.vue diff --git a/Human-Connection/webapp/components/DeleteData/DeleteData.spec.js b/webapp/components/DeleteData/DeleteData.spec.js similarity index 100% rename from Human-Connection/webapp/components/DeleteData/DeleteData.spec.js rename to webapp/components/DeleteData/DeleteData.spec.js diff --git a/Human-Connection/webapp/components/DeleteData/DeleteData.vue b/webapp/components/DeleteData/DeleteData.vue similarity index 100% rename from Human-Connection/webapp/components/DeleteData/DeleteData.vue rename to webapp/components/DeleteData/DeleteData.vue diff --git a/Human-Connection/webapp/components/Dropdown.vue b/webapp/components/Dropdown.vue similarity index 100% rename from Human-Connection/webapp/components/Dropdown.vue rename to webapp/components/Dropdown.vue diff --git a/Human-Connection/webapp/components/Editor/index.vue b/webapp/components/Editor/index.vue similarity index 100% rename from Human-Connection/webapp/components/Editor/index.vue rename to webapp/components/Editor/index.vue diff --git a/Human-Connection/webapp/components/Editor/nodes/Mention.js b/webapp/components/Editor/nodes/Mention.js similarity index 100% rename from Human-Connection/webapp/components/Editor/nodes/Mention.js rename to webapp/components/Editor/nodes/Mention.js diff --git a/Human-Connection/webapp/components/Editor/plugins/eventHandler.js b/webapp/components/Editor/plugins/eventHandler.js similarity index 100% rename from Human-Connection/webapp/components/Editor/plugins/eventHandler.js rename to webapp/components/Editor/plugins/eventHandler.js diff --git a/Human-Connection/webapp/components/Editor/spec.js b/webapp/components/Editor/spec.js similarity index 100% rename from Human-Connection/webapp/components/Editor/spec.js rename to webapp/components/Editor/spec.js diff --git a/Human-Connection/webapp/components/Empty.vue b/webapp/components/Empty.vue similarity index 100% rename from Human-Connection/webapp/components/Empty.vue rename to webapp/components/Empty.vue diff --git a/Human-Connection/webapp/components/FilterMenu/FilterMenu.spec.js b/webapp/components/FilterMenu/FilterMenu.spec.js similarity index 100% rename from Human-Connection/webapp/components/FilterMenu/FilterMenu.spec.js rename to webapp/components/FilterMenu/FilterMenu.spec.js diff --git a/Human-Connection/webapp/components/FilterMenu/FilterMenu.vue b/webapp/components/FilterMenu/FilterMenu.vue similarity index 100% rename from Human-Connection/webapp/components/FilterMenu/FilterMenu.vue rename to webapp/components/FilterMenu/FilterMenu.vue diff --git a/Human-Connection/webapp/components/FollowButton.vue b/webapp/components/FollowButton.vue similarity index 100% rename from Human-Connection/webapp/components/FollowButton.vue rename to webapp/components/FollowButton.vue diff --git a/Human-Connection/webapp/components/LoadMore.vue b/webapp/components/LoadMore.vue similarity index 100% rename from Human-Connection/webapp/components/LoadMore.vue rename to webapp/components/LoadMore.vue diff --git a/Human-Connection/webapp/components/LocaleSwitch/LocaleSwitch.spec.js b/webapp/components/LocaleSwitch/LocaleSwitch.spec.js similarity index 100% rename from Human-Connection/webapp/components/LocaleSwitch/LocaleSwitch.spec.js rename to webapp/components/LocaleSwitch/LocaleSwitch.spec.js diff --git a/Human-Connection/webapp/components/LocaleSwitch/LocaleSwitch.vue b/webapp/components/LocaleSwitch/LocaleSwitch.vue similarity index 100% rename from Human-Connection/webapp/components/LocaleSwitch/LocaleSwitch.vue rename to webapp/components/LocaleSwitch/LocaleSwitch.vue diff --git a/Human-Connection/webapp/components/Logo.vue b/webapp/components/Logo.vue similarity index 100% rename from Human-Connection/webapp/components/Logo.vue rename to webapp/components/Logo.vue diff --git a/Human-Connection/webapp/components/Modal.spec.js b/webapp/components/Modal.spec.js similarity index 100% rename from Human-Connection/webapp/components/Modal.spec.js rename to webapp/components/Modal.spec.js diff --git a/Human-Connection/webapp/components/Modal.vue b/webapp/components/Modal.vue similarity index 100% rename from Human-Connection/webapp/components/Modal.vue rename to webapp/components/Modal.vue diff --git a/Human-Connection/webapp/components/Modal/ConfirmModal.spec.js b/webapp/components/Modal/ConfirmModal.spec.js similarity index 100% rename from Human-Connection/webapp/components/Modal/ConfirmModal.spec.js rename to webapp/components/Modal/ConfirmModal.spec.js diff --git a/Human-Connection/webapp/components/Modal/ConfirmModal.vue b/webapp/components/Modal/ConfirmModal.vue similarity index 100% rename from Human-Connection/webapp/components/Modal/ConfirmModal.vue rename to webapp/components/Modal/ConfirmModal.vue diff --git a/Human-Connection/webapp/components/Modal/DisableModal.spec.js b/webapp/components/Modal/DisableModal.spec.js similarity index 100% rename from Human-Connection/webapp/components/Modal/DisableModal.spec.js rename to webapp/components/Modal/DisableModal.spec.js diff --git a/Human-Connection/webapp/components/Modal/DisableModal.vue b/webapp/components/Modal/DisableModal.vue similarity index 100% rename from Human-Connection/webapp/components/Modal/DisableModal.vue rename to webapp/components/Modal/DisableModal.vue diff --git a/Human-Connection/webapp/components/Modal/ReportModal.spec.js b/webapp/components/Modal/ReportModal.spec.js similarity index 100% rename from Human-Connection/webapp/components/Modal/ReportModal.spec.js rename to webapp/components/Modal/ReportModal.spec.js diff --git a/Human-Connection/webapp/components/Modal/ReportModal.vue b/webapp/components/Modal/ReportModal.vue similarity index 100% rename from Human-Connection/webapp/components/Modal/ReportModal.vue rename to webapp/components/Modal/ReportModal.vue diff --git a/Human-Connection/webapp/components/Password/Change.spec.js b/webapp/components/Password/Change.spec.js similarity index 100% rename from Human-Connection/webapp/components/Password/Change.spec.js rename to webapp/components/Password/Change.spec.js diff --git a/Human-Connection/webapp/components/Password/Change.vue b/webapp/components/Password/Change.vue similarity index 100% rename from Human-Connection/webapp/components/Password/Change.vue rename to webapp/components/Password/Change.vue diff --git a/Human-Connection/webapp/components/Password/Strength.vue b/webapp/components/Password/Strength.vue similarity index 100% rename from Human-Connection/webapp/components/Password/Strength.vue rename to webapp/components/Password/Strength.vue diff --git a/Human-Connection/webapp/components/PasswordReset/ChangePassword.spec.js b/webapp/components/PasswordReset/ChangePassword.spec.js similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/ChangePassword.spec.js rename to webapp/components/PasswordReset/ChangePassword.spec.js diff --git a/Human-Connection/webapp/components/PasswordReset/ChangePassword.vue b/webapp/components/PasswordReset/ChangePassword.vue similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/ChangePassword.vue rename to webapp/components/PasswordReset/ChangePassword.vue diff --git a/Human-Connection/webapp/components/PasswordReset/Request.spec.js b/webapp/components/PasswordReset/Request.spec.js similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/Request.spec.js rename to webapp/components/PasswordReset/Request.spec.js diff --git a/Human-Connection/webapp/components/PasswordReset/Request.vue b/webapp/components/PasswordReset/Request.vue similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/Request.vue rename to webapp/components/PasswordReset/Request.vue diff --git a/Human-Connection/webapp/components/PasswordReset/VerifyCode.spec.js b/webapp/components/PasswordReset/VerifyCode.spec.js similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/VerifyCode.spec.js rename to webapp/components/PasswordReset/VerifyCode.spec.js diff --git a/Human-Connection/webapp/components/PasswordReset/VerifyCode.vue b/webapp/components/PasswordReset/VerifyCode.vue similarity index 100% rename from Human-Connection/webapp/components/PasswordReset/VerifyCode.vue rename to webapp/components/PasswordReset/VerifyCode.vue diff --git a/Human-Connection/webapp/components/PostCard/index.spec.js b/webapp/components/PostCard/index.spec.js similarity index 100% rename from Human-Connection/webapp/components/PostCard/index.spec.js rename to webapp/components/PostCard/index.spec.js diff --git a/Human-Connection/webapp/components/PostCard/index.vue b/webapp/components/PostCard/index.vue similarity index 100% rename from Human-Connection/webapp/components/PostCard/index.vue rename to webapp/components/PostCard/index.vue diff --git a/Human-Connection/webapp/components/RelativeDateTime/Readme.md b/webapp/components/RelativeDateTime/Readme.md similarity index 100% rename from Human-Connection/webapp/components/RelativeDateTime/Readme.md rename to webapp/components/RelativeDateTime/Readme.md diff --git a/Human-Connection/webapp/components/RelativeDateTime/index.vue b/webapp/components/RelativeDateTime/index.vue similarity index 100% rename from Human-Connection/webapp/components/RelativeDateTime/index.vue rename to webapp/components/RelativeDateTime/index.vue diff --git a/Human-Connection/webapp/components/RelativeDateTime/spec.js b/webapp/components/RelativeDateTime/spec.js similarity index 100% rename from Human-Connection/webapp/components/RelativeDateTime/spec.js rename to webapp/components/RelativeDateTime/spec.js diff --git a/Human-Connection/webapp/components/ReleaseModal/ReleaseModal.spec.js b/webapp/components/ReleaseModal/ReleaseModal.spec.js similarity index 100% rename from Human-Connection/webapp/components/ReleaseModal/ReleaseModal.spec.js rename to webapp/components/ReleaseModal/ReleaseModal.spec.js diff --git a/Human-Connection/webapp/components/ReleaseModal/ReleaseModal.vue b/webapp/components/ReleaseModal/ReleaseModal.vue similarity index 100% rename from Human-Connection/webapp/components/ReleaseModal/ReleaseModal.vue rename to webapp/components/ReleaseModal/ReleaseModal.vue diff --git a/Human-Connection/webapp/components/Ribbon/index.spec.js b/webapp/components/Ribbon/index.spec.js similarity index 100% rename from Human-Connection/webapp/components/Ribbon/index.spec.js rename to webapp/components/Ribbon/index.spec.js diff --git a/Human-Connection/webapp/components/Ribbon/index.vue b/webapp/components/Ribbon/index.vue similarity index 100% rename from Human-Connection/webapp/components/Ribbon/index.vue rename to webapp/components/Ribbon/index.vue diff --git a/Human-Connection/webapp/components/SearchInput.spec.js b/webapp/components/SearchInput.spec.js similarity index 100% rename from Human-Connection/webapp/components/SearchInput.spec.js rename to webapp/components/SearchInput.spec.js diff --git a/Human-Connection/webapp/components/SearchInput.vue b/webapp/components/SearchInput.vue similarity index 100% rename from Human-Connection/webapp/components/SearchInput.vue rename to webapp/components/SearchInput.vue diff --git a/Human-Connection/webapp/components/ShoutButton.vue b/webapp/components/ShoutButton.vue similarity index 100% rename from Human-Connection/webapp/components/ShoutButton.vue rename to webapp/components/ShoutButton.vue diff --git a/Human-Connection/webapp/components/Tag/Readme.md b/webapp/components/Tag/Readme.md similarity index 100% rename from Human-Connection/webapp/components/Tag/Readme.md rename to webapp/components/Tag/Readme.md diff --git a/Human-Connection/webapp/components/Tag/index.vue b/webapp/components/Tag/index.vue similarity index 100% rename from Human-Connection/webapp/components/Tag/index.vue rename to webapp/components/Tag/index.vue diff --git a/Human-Connection/webapp/components/Tag/spec.js b/webapp/components/Tag/spec.js similarity index 100% rename from Human-Connection/webapp/components/Tag/spec.js rename to webapp/components/Tag/spec.js diff --git a/Human-Connection/webapp/components/TeaserImage/TeaserImage.spec.js b/webapp/components/TeaserImage/TeaserImage.spec.js similarity index 100% rename from Human-Connection/webapp/components/TeaserImage/TeaserImage.spec.js rename to webapp/components/TeaserImage/TeaserImage.spec.js diff --git a/Human-Connection/webapp/components/TeaserImage/TeaserImage.vue b/webapp/components/TeaserImage/TeaserImage.vue similarity index 100% rename from Human-Connection/webapp/components/TeaserImage/TeaserImage.vue rename to webapp/components/TeaserImage/TeaserImage.vue diff --git a/Human-Connection/webapp/components/Upload/index.vue b/webapp/components/Upload/index.vue similarity index 100% rename from Human-Connection/webapp/components/Upload/index.vue rename to webapp/components/Upload/index.vue diff --git a/Human-Connection/webapp/components/Upload/spec.js b/webapp/components/Upload/spec.js similarity index 100% rename from Human-Connection/webapp/components/Upload/spec.js rename to webapp/components/Upload/spec.js diff --git a/Human-Connection/webapp/components/User/index.vue b/webapp/components/User/index.vue similarity index 100% rename from Human-Connection/webapp/components/User/index.vue rename to webapp/components/User/index.vue diff --git a/Human-Connection/webapp/components/User/spec.js b/webapp/components/User/spec.js similarity index 100% rename from Human-Connection/webapp/components/User/spec.js rename to webapp/components/User/spec.js diff --git a/Human-Connection/webapp/components/comments/CommentForm/index.vue b/webapp/components/comments/CommentForm/index.vue similarity index 100% rename from Human-Connection/webapp/components/comments/CommentForm/index.vue rename to webapp/components/comments/CommentForm/index.vue diff --git a/Human-Connection/webapp/components/comments/CommentForm/spec.js b/webapp/components/comments/CommentForm/spec.js similarity index 100% rename from Human-Connection/webapp/components/comments/CommentForm/spec.js rename to webapp/components/comments/CommentForm/spec.js diff --git a/Human-Connection/webapp/components/comments/CommentList/CommentList.spec.js b/webapp/components/comments/CommentList/CommentList.spec.js similarity index 100% rename from Human-Connection/webapp/components/comments/CommentList/CommentList.spec.js rename to webapp/components/comments/CommentList/CommentList.spec.js diff --git a/Human-Connection/webapp/components/comments/CommentList/index.vue b/webapp/components/comments/CommentList/index.vue similarity index 100% rename from Human-Connection/webapp/components/comments/CommentList/index.vue rename to webapp/components/comments/CommentList/index.vue diff --git a/Human-Connection/webapp/components/notifications/Notification/index.vue b/webapp/components/notifications/Notification/index.vue similarity index 100% rename from Human-Connection/webapp/components/notifications/Notification/index.vue rename to webapp/components/notifications/Notification/index.vue diff --git a/Human-Connection/webapp/components/notifications/Notification/spec.js b/webapp/components/notifications/Notification/spec.js similarity index 100% rename from Human-Connection/webapp/components/notifications/Notification/spec.js rename to webapp/components/notifications/Notification/spec.js diff --git a/Human-Connection/webapp/components/notifications/NotificationList/index.vue b/webapp/components/notifications/NotificationList/index.vue similarity index 100% rename from Human-Connection/webapp/components/notifications/NotificationList/index.vue rename to webapp/components/notifications/NotificationList/index.vue diff --git a/Human-Connection/webapp/components/notifications/NotificationList/spec.js b/webapp/components/notifications/NotificationList/spec.js similarity index 100% rename from Human-Connection/webapp/components/notifications/NotificationList/spec.js rename to webapp/components/notifications/NotificationList/spec.js diff --git a/Human-Connection/webapp/components/notifications/NotificationMenu/index.vue b/webapp/components/notifications/NotificationMenu/index.vue similarity index 100% rename from Human-Connection/webapp/components/notifications/NotificationMenu/index.vue rename to webapp/components/notifications/NotificationMenu/index.vue diff --git a/Human-Connection/webapp/components/notifications/NotificationMenu/spec.js b/webapp/components/notifications/NotificationMenu/spec.js similarity index 100% rename from Human-Connection/webapp/components/notifications/NotificationMenu/spec.js rename to webapp/components/notifications/NotificationMenu/spec.js diff --git a/Human-Connection/webapp/components/utils/PostHelpers.js b/webapp/components/utils/PostHelpers.js similarity index 100% rename from Human-Connection/webapp/components/utils/PostHelpers.js rename to webapp/components/utils/PostHelpers.js diff --git a/Human-Connection/webapp/graphql/CommentMutations.js b/webapp/graphql/CommentMutations.js similarity index 100% rename from Human-Connection/webapp/graphql/CommentMutations.js rename to webapp/graphql/CommentMutations.js diff --git a/Human-Connection/webapp/graphql/CommentQuery.js b/webapp/graphql/CommentQuery.js similarity index 100% rename from Human-Connection/webapp/graphql/CommentQuery.js rename to webapp/graphql/CommentQuery.js diff --git a/Human-Connection/webapp/graphql/ModerationListQuery.js b/webapp/graphql/ModerationListQuery.js similarity index 100% rename from Human-Connection/webapp/graphql/ModerationListQuery.js rename to webapp/graphql/ModerationListQuery.js diff --git a/Human-Connection/webapp/graphql/PostCommentsQuery.js b/webapp/graphql/PostCommentsQuery.js similarity index 100% rename from Human-Connection/webapp/graphql/PostCommentsQuery.js rename to webapp/graphql/PostCommentsQuery.js diff --git a/Human-Connection/webapp/graphql/PostMutations.js b/webapp/graphql/PostMutations.js similarity index 100% rename from Human-Connection/webapp/graphql/PostMutations.js rename to webapp/graphql/PostMutations.js diff --git a/Human-Connection/webapp/graphql/PostQuery.js b/webapp/graphql/PostQuery.js similarity index 100% rename from Human-Connection/webapp/graphql/PostQuery.js rename to webapp/graphql/PostQuery.js diff --git a/Human-Connection/webapp/graphql/UserProfile/Post.js b/webapp/graphql/UserProfile/Post.js similarity index 100% rename from Human-Connection/webapp/graphql/UserProfile/Post.js rename to webapp/graphql/UserProfile/Post.js diff --git a/Human-Connection/webapp/graphql/UserProfile/User.js b/webapp/graphql/UserProfile/User.js similarity index 100% rename from Human-Connection/webapp/graphql/UserProfile/User.js rename to webapp/graphql/UserProfile/User.js diff --git a/Human-Connection/webapp/layouts.md b/webapp/layouts.md similarity index 100% rename from Human-Connection/webapp/layouts.md rename to webapp/layouts.md diff --git a/Human-Connection/webapp/layouts/blank.vue b/webapp/layouts/blank.vue similarity index 100% rename from Human-Connection/webapp/layouts/blank.vue rename to webapp/layouts/blank.vue diff --git a/Human-Connection/webapp/layouts/default.vue b/webapp/layouts/default.vue similarity index 100% rename from Human-Connection/webapp/layouts/default.vue rename to webapp/layouts/default.vue diff --git a/Human-Connection/webapp/locales/de.json b/webapp/locales/de.json similarity index 100% rename from Human-Connection/webapp/locales/de.json rename to webapp/locales/de.json diff --git a/Human-Connection/webapp/locales/en.json b/webapp/locales/en.json similarity index 100% rename from Human-Connection/webapp/locales/en.json rename to webapp/locales/en.json diff --git a/Human-Connection/webapp/locales/es.json b/webapp/locales/es.json similarity index 100% rename from Human-Connection/webapp/locales/es.json rename to webapp/locales/es.json diff --git a/Human-Connection/webapp/locales/fr.json b/webapp/locales/fr.json similarity index 100% rename from Human-Connection/webapp/locales/fr.json rename to webapp/locales/fr.json diff --git a/Human-Connection/webapp/locales/index.js b/webapp/locales/index.js similarity index 100% rename from Human-Connection/webapp/locales/index.js rename to webapp/locales/index.js diff --git a/Human-Connection/webapp/locales/it.json b/webapp/locales/it.json similarity index 100% rename from Human-Connection/webapp/locales/it.json rename to webapp/locales/it.json diff --git a/Human-Connection/webapp/locales/nl.json b/webapp/locales/nl.json similarity index 100% rename from Human-Connection/webapp/locales/nl.json rename to webapp/locales/nl.json diff --git a/Human-Connection/webapp/locales/pl.json b/webapp/locales/pl.json similarity index 100% rename from Human-Connection/webapp/locales/pl.json rename to webapp/locales/pl.json diff --git a/Human-Connection/webapp/locales/pt.json b/webapp/locales/pt.json similarity index 100% rename from Human-Connection/webapp/locales/pt.json rename to webapp/locales/pt.json diff --git a/Human-Connection/webapp/lokalise.png b/webapp/lokalise.png similarity index 100% rename from Human-Connection/webapp/lokalise.png rename to webapp/lokalise.png diff --git a/Human-Connection/webapp/middleware.md b/webapp/middleware.md similarity index 100% rename from Human-Connection/webapp/middleware.md rename to webapp/middleware.md diff --git a/Human-Connection/webapp/middleware/authenticated.js b/webapp/middleware/authenticated.js similarity index 100% rename from Human-Connection/webapp/middleware/authenticated.js rename to webapp/middleware/authenticated.js diff --git a/Human-Connection/webapp/middleware/isAdmin.js b/webapp/middleware/isAdmin.js similarity index 100% rename from Human-Connection/webapp/middleware/isAdmin.js rename to webapp/middleware/isAdmin.js diff --git a/Human-Connection/webapp/middleware/isModerator.js b/webapp/middleware/isModerator.js similarity index 100% rename from Human-Connection/webapp/middleware/isModerator.js rename to webapp/middleware/isModerator.js diff --git a/Human-Connection/webapp/mixins/persistentLinks.js b/webapp/mixins/persistentLinks.js similarity index 100% rename from Human-Connection/webapp/mixins/persistentLinks.js rename to webapp/mixins/persistentLinks.js diff --git a/Human-Connection/webapp/mixins/seo.js b/webapp/mixins/seo.js similarity index 100% rename from Human-Connection/webapp/mixins/seo.js rename to webapp/mixins/seo.js diff --git a/Human-Connection/webapp/nuxt.config.js b/webapp/nuxt.config.js similarity index 100% rename from Human-Connection/webapp/nuxt.config.js rename to webapp/nuxt.config.js diff --git a/Human-Connection/webapp/package.json b/webapp/package.json similarity index 100% rename from Human-Connection/webapp/package.json rename to webapp/package.json diff --git a/Human-Connection/webapp/pages.md b/webapp/pages.md similarity index 100% rename from Human-Connection/webapp/pages.md rename to webapp/pages.md diff --git a/Human-Connection/webapp/pages/admin.vue b/webapp/pages/admin.vue similarity index 100% rename from Human-Connection/webapp/pages/admin.vue rename to webapp/pages/admin.vue diff --git a/Human-Connection/webapp/pages/admin/categories.vue b/webapp/pages/admin/categories.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/categories.vue rename to webapp/pages/admin/categories.vue diff --git a/Human-Connection/webapp/pages/admin/index.vue b/webapp/pages/admin/index.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/index.vue rename to webapp/pages/admin/index.vue diff --git a/Human-Connection/webapp/pages/admin/notifications.vue b/webapp/pages/admin/notifications.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/notifications.vue rename to webapp/pages/admin/notifications.vue diff --git a/Human-Connection/webapp/pages/admin/organizations.vue b/webapp/pages/admin/organizations.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/organizations.vue rename to webapp/pages/admin/organizations.vue diff --git a/Human-Connection/webapp/pages/admin/pages.vue b/webapp/pages/admin/pages.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/pages.vue rename to webapp/pages/admin/pages.vue diff --git a/Human-Connection/webapp/pages/admin/settings.vue b/webapp/pages/admin/settings.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/settings.vue rename to webapp/pages/admin/settings.vue diff --git a/Human-Connection/webapp/pages/admin/tags.vue b/webapp/pages/admin/tags.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/tags.vue rename to webapp/pages/admin/tags.vue diff --git a/Human-Connection/webapp/pages/admin/users.vue b/webapp/pages/admin/users.vue similarity index 100% rename from Human-Connection/webapp/pages/admin/users.vue rename to webapp/pages/admin/users.vue diff --git a/Human-Connection/webapp/pages/index.vue b/webapp/pages/index.vue similarity index 100% rename from Human-Connection/webapp/pages/index.vue rename to webapp/pages/index.vue diff --git a/Human-Connection/webapp/pages/login.vue b/webapp/pages/login.vue similarity index 100% rename from Human-Connection/webapp/pages/login.vue rename to webapp/pages/login.vue diff --git a/Human-Connection/webapp/pages/logout.vue b/webapp/pages/logout.vue similarity index 100% rename from Human-Connection/webapp/pages/logout.vue rename to webapp/pages/logout.vue diff --git a/Human-Connection/webapp/pages/moderation.vue b/webapp/pages/moderation.vue similarity index 100% rename from Human-Connection/webapp/pages/moderation.vue rename to webapp/pages/moderation.vue diff --git a/Human-Connection/webapp/pages/moderation/index.vue b/webapp/pages/moderation/index.vue similarity index 100% rename from Human-Connection/webapp/pages/moderation/index.vue rename to webapp/pages/moderation/index.vue diff --git a/Human-Connection/webapp/pages/password-reset.vue b/webapp/pages/password-reset.vue similarity index 100% rename from Human-Connection/webapp/pages/password-reset.vue rename to webapp/pages/password-reset.vue diff --git a/Human-Connection/webapp/pages/password-reset/change-password.vue b/webapp/pages/password-reset/change-password.vue similarity index 100% rename from Human-Connection/webapp/pages/password-reset/change-password.vue rename to webapp/pages/password-reset/change-password.vue diff --git a/Human-Connection/webapp/pages/password-reset/request.vue b/webapp/pages/password-reset/request.vue similarity index 100% rename from Human-Connection/webapp/pages/password-reset/request.vue rename to webapp/pages/password-reset/request.vue diff --git a/Human-Connection/webapp/pages/password-reset/verify-code.vue b/webapp/pages/password-reset/verify-code.vue similarity index 100% rename from Human-Connection/webapp/pages/password-reset/verify-code.vue rename to webapp/pages/password-reset/verify-code.vue diff --git a/Human-Connection/webapp/pages/post/_id.vue b/webapp/pages/post/_id.vue similarity index 100% rename from Human-Connection/webapp/pages/post/_id.vue rename to webapp/pages/post/_id.vue diff --git a/Human-Connection/webapp/pages/post/_id/_slug/index.spec.js b/webapp/pages/post/_id/_slug/index.spec.js similarity index 100% rename from Human-Connection/webapp/pages/post/_id/_slug/index.spec.js rename to webapp/pages/post/_id/_slug/index.spec.js diff --git a/Human-Connection/webapp/pages/post/_id/_slug/index.vue b/webapp/pages/post/_id/_slug/index.vue similarity index 100% rename from Human-Connection/webapp/pages/post/_id/_slug/index.vue rename to webapp/pages/post/_id/_slug/index.vue diff --git a/Human-Connection/webapp/pages/post/_id/_slug/more-info.vue b/webapp/pages/post/_id/_slug/more-info.vue similarity index 100% rename from Human-Connection/webapp/pages/post/_id/_slug/more-info.vue rename to webapp/pages/post/_id/_slug/more-info.vue diff --git a/Human-Connection/webapp/pages/post/_id/_slug/take-action.vue b/webapp/pages/post/_id/_slug/take-action.vue similarity index 100% rename from Human-Connection/webapp/pages/post/_id/_slug/take-action.vue rename to webapp/pages/post/_id/_slug/take-action.vue diff --git a/Human-Connection/webapp/pages/post/create.vue b/webapp/pages/post/create.vue similarity index 100% rename from Human-Connection/webapp/pages/post/create.vue rename to webapp/pages/post/create.vue diff --git a/Human-Connection/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue similarity index 100% rename from Human-Connection/webapp/pages/post/edit/_id.vue rename to webapp/pages/post/edit/_id.vue diff --git a/Human-Connection/webapp/pages/profile/_id.vue b/webapp/pages/profile/_id.vue similarity index 100% rename from Human-Connection/webapp/pages/profile/_id.vue rename to webapp/pages/profile/_id.vue diff --git a/Human-Connection/webapp/pages/profile/_id/_slug.spec.js b/webapp/pages/profile/_id/_slug.spec.js similarity index 100% rename from Human-Connection/webapp/pages/profile/_id/_slug.spec.js rename to webapp/pages/profile/_id/_slug.spec.js diff --git a/Human-Connection/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue similarity index 100% rename from Human-Connection/webapp/pages/profile/_id/_slug.vue rename to webapp/pages/profile/_id/_slug.vue diff --git a/Human-Connection/webapp/pages/settings.vue b/webapp/pages/settings.vue similarity index 100% rename from Human-Connection/webapp/pages/settings.vue rename to webapp/pages/settings.vue diff --git a/Human-Connection/webapp/pages/settings/data-download.vue b/webapp/pages/settings/data-download.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/data-download.vue rename to webapp/pages/settings/data-download.vue diff --git a/Human-Connection/webapp/pages/settings/delete-account.vue b/webapp/pages/settings/delete-account.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/delete-account.vue rename to webapp/pages/settings/delete-account.vue diff --git a/Human-Connection/webapp/pages/settings/index.spec.js b/webapp/pages/settings/index.spec.js similarity index 100% rename from Human-Connection/webapp/pages/settings/index.spec.js rename to webapp/pages/settings/index.spec.js diff --git a/Human-Connection/webapp/pages/settings/index.vue b/webapp/pages/settings/index.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/index.vue rename to webapp/pages/settings/index.vue diff --git a/Human-Connection/webapp/pages/settings/invites.vue b/webapp/pages/settings/invites.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/invites.vue rename to webapp/pages/settings/invites.vue diff --git a/Human-Connection/webapp/pages/settings/languages.vue b/webapp/pages/settings/languages.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/languages.vue rename to webapp/pages/settings/languages.vue diff --git a/Human-Connection/webapp/pages/settings/my-organizations.vue b/webapp/pages/settings/my-organizations.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/my-organizations.vue rename to webapp/pages/settings/my-organizations.vue diff --git a/Human-Connection/webapp/pages/settings/my-social-media.spec.js b/webapp/pages/settings/my-social-media.spec.js similarity index 100% rename from Human-Connection/webapp/pages/settings/my-social-media.spec.js rename to webapp/pages/settings/my-social-media.spec.js diff --git a/Human-Connection/webapp/pages/settings/my-social-media.vue b/webapp/pages/settings/my-social-media.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/my-social-media.vue rename to webapp/pages/settings/my-social-media.vue diff --git a/Human-Connection/webapp/pages/settings/security.vue b/webapp/pages/settings/security.vue similarity index 100% rename from Human-Connection/webapp/pages/settings/security.vue rename to webapp/pages/settings/security.vue diff --git a/Human-Connection/webapp/plugins.md b/webapp/plugins.md similarity index 100% rename from Human-Connection/webapp/plugins.md rename to webapp/plugins.md diff --git a/Human-Connection/webapp/plugins/apollo-config.js b/webapp/plugins/apollo-config.js similarity index 100% rename from Human-Connection/webapp/plugins/apollo-config.js rename to webapp/plugins/apollo-config.js diff --git a/Human-Connection/webapp/plugins/axios.js b/webapp/plugins/axios.js similarity index 100% rename from Human-Connection/webapp/plugins/axios.js rename to webapp/plugins/axios.js diff --git a/Human-Connection/webapp/plugins/i18n.js b/webapp/plugins/i18n.js similarity index 100% rename from Human-Connection/webapp/plugins/i18n.js rename to webapp/plugins/i18n.js diff --git a/Human-Connection/webapp/plugins/izi-toast.js b/webapp/plugins/izi-toast.js similarity index 100% rename from Human-Connection/webapp/plugins/izi-toast.js rename to webapp/plugins/izi-toast.js diff --git a/Human-Connection/webapp/plugins/keep-alive.js b/webapp/plugins/keep-alive.js similarity index 100% rename from Human-Connection/webapp/plugins/keep-alive.js rename to webapp/plugins/keep-alive.js diff --git a/Human-Connection/webapp/plugins/styleguide-dev.js b/webapp/plugins/styleguide-dev.js similarity index 100% rename from Human-Connection/webapp/plugins/styleguide-dev.js rename to webapp/plugins/styleguide-dev.js diff --git a/Human-Connection/webapp/plugins/styleguide.js b/webapp/plugins/styleguide.js similarity index 100% rename from Human-Connection/webapp/plugins/styleguide.js rename to webapp/plugins/styleguide.js diff --git a/Human-Connection/webapp/plugins/v-tooltip.js b/webapp/plugins/v-tooltip.js similarity index 100% rename from Human-Connection/webapp/plugins/v-tooltip.js rename to webapp/plugins/v-tooltip.js diff --git a/Human-Connection/webapp/plugins/vue-directives.js b/webapp/plugins/vue-directives.js similarity index 100% rename from Human-Connection/webapp/plugins/vue-directives.js rename to webapp/plugins/vue-directives.js diff --git a/Human-Connection/webapp/plugins/vue-filters.js b/webapp/plugins/vue-filters.js similarity index 100% rename from Human-Connection/webapp/plugins/vue-filters.js rename to webapp/plugins/vue-filters.js diff --git a/Human-Connection/webapp/screenshot-styleguide.png b/webapp/screenshot-styleguide.png similarity index 100% rename from Human-Connection/webapp/screenshot-styleguide.png rename to webapp/screenshot-styleguide.png diff --git a/Human-Connection/webapp/screenshot.png b/webapp/screenshot.png similarity index 100% rename from Human-Connection/webapp/screenshot.png rename to webapp/screenshot.png diff --git a/Human-Connection/webapp/server/index.js b/webapp/server/index.js similarity index 100% rename from Human-Connection/webapp/server/index.js rename to webapp/server/index.js diff --git a/Human-Connection/webapp/static.md b/webapp/static.md similarity index 100% rename from Human-Connection/webapp/static.md rename to webapp/static.md diff --git a/Human-Connection/webapp/static/favicon.ico b/webapp/static/favicon.ico similarity index 100% rename from Human-Connection/webapp/static/favicon.ico rename to webapp/static/favicon.ico diff --git a/Human-Connection/webapp/static/img/empty-state.svg b/webapp/static/img/empty-state.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty-state.svg rename to webapp/static/img/empty-state.svg diff --git a/Human-Connection/webapp/static/img/empty/alert.svg b/webapp/static/img/empty/alert.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/alert.svg rename to webapp/static/img/empty/alert.svg diff --git a/Human-Connection/webapp/static/img/empty/docs.svg b/webapp/static/img/empty/docs.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/docs.svg rename to webapp/static/img/empty/docs.svg diff --git a/Human-Connection/webapp/static/img/empty/events.svg b/webapp/static/img/empty/events.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/events.svg rename to webapp/static/img/empty/events.svg diff --git a/Human-Connection/webapp/static/img/empty/file.svg b/webapp/static/img/empty/file.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/file.svg rename to webapp/static/img/empty/file.svg diff --git a/Human-Connection/webapp/static/img/empty/messages.svg b/webapp/static/img/empty/messages.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/messages.svg rename to webapp/static/img/empty/messages.svg diff --git a/Human-Connection/webapp/static/img/empty/tasks.svg b/webapp/static/img/empty/tasks.svg similarity index 100% rename from Human-Connection/webapp/static/img/empty/tasks.svg rename to webapp/static/img/empty/tasks.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/de.svg b/webapp/static/img/locale-flags/de.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/de.svg rename to webapp/static/img/locale-flags/de.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/en.svg b/webapp/static/img/locale-flags/en.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/en.svg rename to webapp/static/img/locale-flags/en.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/es.svg b/webapp/static/img/locale-flags/es.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/es.svg rename to webapp/static/img/locale-flags/es.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/fr.svg b/webapp/static/img/locale-flags/fr.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/fr.svg rename to webapp/static/img/locale-flags/fr.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/it.svg b/webapp/static/img/locale-flags/it.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/it.svg rename to webapp/static/img/locale-flags/it.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/nl.svg b/webapp/static/img/locale-flags/nl.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/nl.svg rename to webapp/static/img/locale-flags/nl.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/pl.svg b/webapp/static/img/locale-flags/pl.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/pl.svg rename to webapp/static/img/locale-flags/pl.svg diff --git a/Human-Connection/webapp/static/img/locale-flags/pt.svg b/webapp/static/img/locale-flags/pt.svg similarity index 100% rename from Human-Connection/webapp/static/img/locale-flags/pt.svg rename to webapp/static/img/locale-flags/pt.svg diff --git a/Human-Connection/webapp/static/img/sign-up/alpha-invite.png b/webapp/static/img/sign-up/alpha-invite.png similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/alpha-invite.png rename to webapp/static/img/sign-up/alpha-invite.png diff --git a/Human-Connection/webapp/static/img/sign-up/alpha-invite2x.png b/webapp/static/img/sign-up/alpha-invite2x.png similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/alpha-invite2x.png rename to webapp/static/img/sign-up/alpha-invite2x.png diff --git a/Human-Connection/webapp/static/img/sign-up/humanconnection.png b/webapp/static/img/sign-up/humanconnection.png similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/humanconnection.png rename to webapp/static/img/sign-up/humanconnection.png diff --git a/Human-Connection/webapp/static/img/sign-up/humanconnection.svg b/webapp/static/img/sign-up/humanconnection.svg similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/humanconnection.svg rename to webapp/static/img/sign-up/humanconnection.svg diff --git a/Human-Connection/webapp/static/img/sign-up/nicetomeetyou.png b/webapp/static/img/sign-up/nicetomeetyou.png similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/nicetomeetyou.png rename to webapp/static/img/sign-up/nicetomeetyou.png diff --git a/Human-Connection/webapp/static/img/sign-up/nicetomeetyou.svg b/webapp/static/img/sign-up/nicetomeetyou.svg similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/nicetomeetyou.svg rename to webapp/static/img/sign-up/nicetomeetyou.svg diff --git a/Human-Connection/webapp/static/img/sign-up/onourjourney.png b/webapp/static/img/sign-up/onourjourney.png similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/onourjourney.png rename to webapp/static/img/sign-up/onourjourney.png diff --git a/Human-Connection/webapp/static/img/sign-up/onourjourney.svg b/webapp/static/img/sign-up/onourjourney.svg similarity index 100% rename from Human-Connection/webapp/static/img/sign-up/onourjourney.svg rename to webapp/static/img/sign-up/onourjourney.svg diff --git a/Human-Connection/webapp/store.md b/webapp/store.md similarity index 100% rename from Human-Connection/webapp/store.md rename to webapp/store.md diff --git a/Human-Connection/webapp/store/auth.js b/webapp/store/auth.js similarity index 100% rename from Human-Connection/webapp/store/auth.js rename to webapp/store/auth.js diff --git a/Human-Connection/webapp/store/auth.test.js b/webapp/store/auth.test.js similarity index 100% rename from Human-Connection/webapp/store/auth.test.js rename to webapp/store/auth.test.js diff --git a/Human-Connection/webapp/store/editor.js b/webapp/store/editor.js similarity index 100% rename from Human-Connection/webapp/store/editor.js rename to webapp/store/editor.js diff --git a/Human-Connection/webapp/store/editor.spec.js b/webapp/store/editor.spec.js similarity index 100% rename from Human-Connection/webapp/store/editor.spec.js rename to webapp/store/editor.spec.js diff --git a/Human-Connection/webapp/store/index.js b/webapp/store/index.js similarity index 100% rename from Human-Connection/webapp/store/index.js rename to webapp/store/index.js diff --git a/Human-Connection/webapp/store/modal.js b/webapp/store/modal.js similarity index 100% rename from Human-Connection/webapp/store/modal.js rename to webapp/store/modal.js diff --git a/Human-Connection/webapp/store/notifications.js b/webapp/store/notifications.js similarity index 100% rename from Human-Connection/webapp/store/notifications.js rename to webapp/store/notifications.js diff --git a/Human-Connection/webapp/store/search.js b/webapp/store/search.js similarity index 100% rename from Human-Connection/webapp/store/search.js rename to webapp/store/search.js diff --git a/Human-Connection/webapp/styleguide.md b/webapp/styleguide.md similarity index 100% rename from Human-Connection/webapp/styleguide.md rename to webapp/styleguide.md diff --git a/Human-Connection/webapp/testing.md b/webapp/testing.md similarity index 100% rename from Human-Connection/webapp/testing.md rename to webapp/testing.md diff --git a/Human-Connection/webapp/yarn.lock b/webapp/yarn.lock similarity index 100% rename from Human-Connection/webapp/yarn.lock rename to webapp/yarn.lock diff --git a/Human-Connection/yarn.lock b/yarn.lock similarity index 100% rename from Human-Connection/yarn.lock rename to yarn.lock From ed658e9d32613fabbb377f0351bcbe6585e2726c Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 11:12:43 -0300 Subject: [PATCH 026/130] Dockerize embed, kubernetes config, add back deployment .env --- .../human-connection/deployment-embed.yaml | 38 +++++++++++++++++++ .../human-connection/service-embed.yaml | 14 +++++++ .../maintenance-worker/binaries/.env | 6 +++ .../maintenance-worker/migration/mongo/.env | 17 +++++++++ .../maintenance-worker/migration/neo4j/.env | 16 ++++++++ docker-compose.yml | 11 +++++- embed/Dockerfile | 15 ++++++++ 7 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 deployment/human-connection/deployment-embed.yaml create mode 100644 deployment/human-connection/service-embed.yaml create mode 100644 deployment/legacy-migration/maintenance-worker/binaries/.env create mode 100644 deployment/legacy-migration/maintenance-worker/migration/mongo/.env create mode 100644 deployment/legacy-migration/maintenance-worker/migration/neo4j/.env create mode 100644 embed/Dockerfile diff --git a/deployment/human-connection/deployment-embed.yaml b/deployment/human-connection/deployment-embed.yaml new file mode 100644 index 000000000..405b4bca2 --- /dev/null +++ b/deployment/human-connection/deployment-embed.yaml @@ -0,0 +1,38 @@ +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nitro-embed + namespace: human-connection +spec: + replicas: 1 + minReadySeconds: 15 + progressDeadlineSeconds: 60 + strategy: + rollingUpdate: + maxSurge: 0 + maxUnavailable: "100%" + selector: + matchLabels: + human-connection.org/selector: deployment-human-connection-embed + template: + metadata: + labels: + human-connection.org/commit: COMMIT + human-connection.org/selector: deployment-human-connection-embed + name: "nitro-embed" + spec: + containers: + - name: nitro-embed + image: humanconnection/nitro-embed:latest + imagePullPolicy: Always + ports: + - containerPort: 4000 + envFrom: + - configMapRef: + name: configmap + - secretRef: + name: human-connection + restartPolicy: Always + terminationGracePeriodSeconds: 30 +status: {} diff --git a/deployment/human-connection/service-embed.yaml b/deployment/human-connection/service-embed.yaml new file mode 100644 index 000000000..85a4ad7b5 --- /dev/null +++ b/deployment/human-connection/service-embed.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: nitro-embed + namespace: human-connection + labels: + human-connection.org/selector: deployment-human-connection-embed +spec: + ports: + - name: web + port: 3050 + targetPort: 3050 + selector: + human-connection.org/selector: deployment-human-connection-embed diff --git a/deployment/legacy-migration/maintenance-worker/binaries/.env b/deployment/legacy-migration/maintenance-worker/binaries/.env new file mode 100644 index 000000000..773918095 --- /dev/null +++ b/deployment/legacy-migration/maintenance-worker/binaries/.env @@ -0,0 +1,6 @@ +# SSH Access +# SSH_USERNAME='username' +# SSH_HOST='example.org' + +# UPLOADS_DIRECTORY=/var/www/api/uploads +OUTPUT_DIRECTORY='/uploads/' \ No newline at end of file diff --git a/deployment/legacy-migration/maintenance-worker/migration/mongo/.env b/deployment/legacy-migration/maintenance-worker/migration/mongo/.env new file mode 100644 index 000000000..4c5f9e18c --- /dev/null +++ b/deployment/legacy-migration/maintenance-worker/migration/mongo/.env @@ -0,0 +1,17 @@ +# SSH Access +# SSH_USERNAME='username' +# SSH_HOST='example.org' + +# Mongo DB on Remote Maschine +# MONGODB_USERNAME='mongouser' +# MONGODB_PASSWORD='mongopassword' +# MONGODB_DATABASE='mongodatabase' +# MONGODB_AUTH_DB='admin' + +# Export Settings +# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) +EXPORT_PATH='/tmp/mongo-export/' +EXPORT_MONGOEXPORT_BIN='mongoexport' +MONGO_EXPORT_SPLIT_SIZE=100 +# On Windows use something like this +# EXPORT_MONGOEXPORT_BIN='C:\Program Files\MongoDB\Server\3.6\bin\mongoexport.exe' diff --git a/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env b/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env new file mode 100644 index 000000000..16220f3e6 --- /dev/null +++ b/deployment/legacy-migration/maintenance-worker/migration/neo4j/.env @@ -0,0 +1,16 @@ +# Neo4J Settings +# NEO4J_USERNAME='neo4j' +# NEO4J_PASSWORD='letmein' + +# Import Settings +# On Windows this resolves to C:\Users\dornhoeschen\AppData\Local\Temp\mongo-export (MinGW) +IMPORT_PATH='/tmp/mongo-export/' +IMPORT_CHUNK_PATH='/tmp/mongo-export/splits/' + +IMPORT_CHUNK_PATH_CQL='/tmp/mongo-export/splits/' +# On Windows this path needs to be windows style since the cypher-shell runs native - note the forward slash +# IMPORT_CHUNK_PATH_CQL='C:/Users/dornhoeschen/AppData/Local/Temp/mongo-export/splits/' + +IMPORT_CYPHERSHELL_BIN='cypher-shell' +# On Windows use something like this +# IMPORT_CYPHERSHELL_BIN='C:\Program Files\neo4j-community\bin\cypher-shell.bat' \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index ca66217c2..b1a0f4d3f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,15 @@ services: context: neo4j networks: - hc-network - + embed: + image: humanconnection/embed:latest + build: + context: embed + networks: + - hc-network + depends_on: + - neo4j + ports: + - 3050:3050 networks: hc-network: diff --git a/embed/Dockerfile b/embed/Dockerfile new file mode 100644 index 000000000..c1f21cb51 --- /dev/null +++ b/embed/Dockerfile @@ -0,0 +1,15 @@ +FROM node:12.5-alpine +LABEL Description="API Service for fetching URL Information for the Social Network Human-Connection.org" Vendor="Human Connection gGmbH" Version="0.0.1" Maintainer="Human Connection gGmbH (developer@human-connection.org)" + +EXPOSE 3050 +ARG BUILD_COMMIT +ENV BUILD_COMMIT=$BUILD_COMMIT +ARG WORKDIR=/nitro-embed +RUN mkdir -p $WORKDIR +WORKDIR $WORKDIR + +RUN apk --no-cache add git + +COPY . . +RUN yarn install --frozen-lockfile --non-interactive +CMD ["yarn", "run", "start"] From e04ab842bd3811bd8e92117de866072da352cc4a Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Tue, 2 Jul 2019 19:36:20 -0300 Subject: [PATCH 027/130] Add service yaml for nginx(maintenance) service --- deployment/human-connection/service-nginx.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 deployment/human-connection/service-nginx.yaml diff --git a/deployment/human-connection/service-nginx.yaml b/deployment/human-connection/service-nginx.yaml new file mode 100644 index 000000000..2cfe986f6 --- /dev/null +++ b/deployment/human-connection/service-nginx.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: nitro-web + namespace: human-connection + labels: + human-connection.org/selector: deployment-human-connection-web +spec: + ports: + - name: web + port: 3000 + targetPort: 3000 + selector: + human-connection.org/selector: nginx From 438bb36e903bcb2e5c5643ffdb43a0f596fd3280 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 12:13:45 -0300 Subject: [PATCH 028/130] Add nginx maintenance and test locally --- .../human-connection/maintenance/Dockerfile | 2 + .../maintenance/deployment-maintenance.yaml | 37 +++++++++++++++++++ .../maintenance/maintenance.html | 4 ++ .../maintenance/service-maintenance.yaml | 14 +++++++ .../human-connection/service-nginx.yaml | 14 ------- docker-compose.yml | 8 ++++ 6 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 deployment/human-connection/maintenance/Dockerfile create mode 100644 deployment/human-connection/maintenance/deployment-maintenance.yaml create mode 100644 deployment/human-connection/maintenance/maintenance.html create mode 100644 deployment/human-connection/maintenance/service-maintenance.yaml delete mode 100644 deployment/human-connection/service-nginx.yaml diff --git a/deployment/human-connection/maintenance/Dockerfile b/deployment/human-connection/maintenance/Dockerfile new file mode 100644 index 000000000..ad9298b72 --- /dev/null +++ b/deployment/human-connection/maintenance/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:alpine +COPY ./maintenance.html /usr/share/nginx/html/index.html diff --git a/deployment/human-connection/maintenance/deployment-maintenance.yaml b/deployment/human-connection/maintenance/deployment-maintenance.yaml new file mode 100644 index 000000000..3bcdb7bf0 --- /dev/null +++ b/deployment/human-connection/maintenance/deployment-maintenance.yaml @@ -0,0 +1,37 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: maintenance + namespace: human-connection +spec: + replicas: 2 + minReadySeconds: 15 + progressDeadlineSeconds: 60 + selector: + matchLabels: + human-connection.org/selector: deployment-human-connection-nginx + template: + metadata: + labels: + human-connection.org/commit: COMMIT + human-connection.org/selector: deployment-human-connection-nginx + name: maintenance + spec: + containers: + - name: web + envFrom: + - configMapRef: + name: configmap + - secretRef: + name: human-connection + env: + - name: HOST + value: 0.0.0.0 + image: humanconnection/maintenance:latest + ports: + - containerPort: 80 + resources: {} + imagePullPolicy: Always + restartPolicy: Always + terminationGracePeriodSeconds: 30 +status: {} diff --git a/deployment/human-connection/maintenance/maintenance.html b/deployment/human-connection/maintenance/maintenance.html new file mode 100644 index 000000000..a59c639f4 --- /dev/null +++ b/deployment/human-connection/maintenance/maintenance.html @@ -0,0 +1,4 @@ +

+ At the moment we are doing some scheduled maintenance, please try again later. + Any questions or concerns, send an email to info@human-connection.org +

diff --git a/deployment/human-connection/maintenance/service-maintenance.yaml b/deployment/human-connection/maintenance/service-maintenance.yaml new file mode 100644 index 000000000..34bef9b68 --- /dev/null +++ b/deployment/human-connection/maintenance/service-maintenance.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: maintenance + namespace: human-connection + labels: + human-connection.org/selector: deployment-human-connection-nginx +spec: + ports: + - name: web + port: 80 + targetPort: 80 + selector: + human-connection.org/selector: deployment-human-connection-nginx diff --git a/deployment/human-connection/service-nginx.yaml b/deployment/human-connection/service-nginx.yaml deleted file mode 100644 index 2cfe986f6..000000000 --- a/deployment/human-connection/service-nginx.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: nitro-web - namespace: human-connection - labels: - human-connection.org/selector: deployment-human-connection-web -spec: - ports: - - name: web - port: 3000 - targetPort: 3000 - selector: - human-connection.org/selector: nginx diff --git a/docker-compose.yml b/docker-compose.yml index ca66217c2..86d3d4b2a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,14 @@ services: context: neo4j networks: - hc-network + maintenance: + image: humanconnection/maintenance:latest + build: + context: deployment/human-connection/maintenance + networks: + - hc-network + ports: + - 80:80 networks: hc-network: From 5827222e47cc4b737d667492519e827b7a480f93 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 14:54:19 -0300 Subject: [PATCH 029/130] Rename labels, decrease replicas to 1 --- .../maintenance/deployment-maintenance.yaml | 6 +++--- .../human-connection/maintenance/service-maintenance.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deployment/human-connection/maintenance/deployment-maintenance.yaml b/deployment/human-connection/maintenance/deployment-maintenance.yaml index 3bcdb7bf0..4fe519997 100644 --- a/deployment/human-connection/maintenance/deployment-maintenance.yaml +++ b/deployment/human-connection/maintenance/deployment-maintenance.yaml @@ -4,17 +4,17 @@ metadata: name: maintenance namespace: human-connection spec: - replicas: 2 + replicas: 1 minReadySeconds: 15 progressDeadlineSeconds: 60 selector: matchLabels: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance template: metadata: labels: human-connection.org/commit: COMMIT - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance name: maintenance spec: containers: diff --git a/deployment/human-connection/maintenance/service-maintenance.yaml b/deployment/human-connection/maintenance/service-maintenance.yaml index 34bef9b68..43aab9331 100644 --- a/deployment/human-connection/maintenance/service-maintenance.yaml +++ b/deployment/human-connection/maintenance/service-maintenance.yaml @@ -4,11 +4,11 @@ metadata: name: maintenance namespace: human-connection labels: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance spec: ports: - name: web port: 80 targetPort: 80 selector: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance From cb356161e553a6dca377f7c3c65b70c51a895a4c Mon Sep 17 00:00:00 2001 From: senderfm Date: Thu, 4 Jul 2019 16:53:56 +0200 Subject: [PATCH 030/130] HcContributionForm submit is disabled by default --- webapp/components/ContributionForm/ContributionForm.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index c6bb2cdc4..cb56432b8 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -92,7 +92,7 @@ export default { }, id: null, loading: false, - disabled: false, + disabled: true, slug: null, users: [], } @@ -169,6 +169,11 @@ export default { }, updateEditorContent(value) { // this.form.content = value + this.disabled = true + if (value.replace(/

|<\/p>|

|<\/h3>|

|<\/h4>/gm, '').length > 3) { + this.disabled = false + } + this.$refs.contributionForm.update('content', value) }, availableLocales() { From 23cf309cfc1c7803f9366adc931857e49994f1c3 Mon Sep 17 00:00:00 2001 From: senderfm Date: Thu, 4 Jul 2019 17:14:02 +0200 Subject: [PATCH 031/130] HcContributionForm submit is disabled by default replace all editor html tags --- webapp/components/ContributionForm/ContributionForm.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index cb56432b8..c91ed9741 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -170,7 +170,12 @@ export default { updateEditorContent(value) { // this.form.content = value this.disabled = true - if (value.replace(/

|<\/p>|

|<\/h3>|

|<\/h4>/gm, '').length > 3) { + if ( + value.replace( + /

|<\/p>|

|<\/h3>|

|<\/h4>|
    |<\/ul>|
      |<\/ol>|
    1. |<\/li>|
      |<\/blockquote>||<\/strong>||<\/em>||<\/a>/gm, + '', + ).length > 3 + ) { this.disabled = false } From aa264a0d56957ac3d6a9007812544a08d97127a0 Mon Sep 17 00:00:00 2001 From: senderfm Date: Thu, 4 Jul 2019 18:02:06 +0200 Subject: [PATCH 032/130] fixed specs, test ok --- .../ContributionForm/ContributionForm.spec.js | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 0813d16f0..3efc7dd6d 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -26,7 +26,10 @@ describe('ContributionForm.vue', () => { const postTitle = 'this is a title for a post' const postContent = 'this is a post' const imageUpload = { - file: { filename: 'avataar.svg', previewElement: '' }, + file: { + filename: 'avataar.svg', + previewElement: '', + }, url: 'someUrlToImage', } const image = '/uploads/1562010976466-avataaars' @@ -47,7 +50,9 @@ describe('ContributionForm.vue', () => { }, }, }) - .mockRejectedValue({ message: 'Not Authorised!' }), + .mockRejectedValue({ + message: 'Not Authorised!', + }), }, $toast: { error: jest.fn(), @@ -74,12 +79,26 @@ describe('ContributionForm.vue', () => { getters, }) const Wrapper = () => { - return mount(ContributionForm, { mocks, localVue, store, propsData }) + return mount(ContributionForm, { + mocks, + localVue, + store, + propsData, + }) } beforeEach(() => { wrapper = Wrapper() - wrapper.setData({ form: { languageOptions: [{ label: 'Deutsch', value: 'de' }] } }) + wrapper.setData({ + form: { + languageOptions: [ + { + label: 'Deutsch', + value: 'de', + }, + ], + }, + }) }) describe('CreatePost', () => { @@ -168,7 +187,7 @@ describe('ContributionForm.vue', () => { it('calls $router.back() when cancel button clicked', () => { cancelBtn = wrapper.find('.cancel-button') cancelBtn.trigger('click') - expect(mocks.$router.back).toHaveBeenCalledTimes(1) + expect(mocks.$router.back).toHaveBeenCalledTimes(0) }) }) @@ -201,7 +220,12 @@ describe('ContributionForm.vue', () => { content: 'auf Deutsch geschrieben', language: 'de', image, - categories: [{ id: 'cat12', name: 'Democracy & Politics' }], + categories: [ + { + id: 'cat12', + name: 'Democracy & Politics', + }, + ], }, } wrapper = Wrapper() From 3481b1f24baf492ea549db63c6bfc6879a45727c Mon Sep 17 00:00:00 2001 From: senderfm Date: Wed, 10 Jul 2019 09:18:47 +0200 Subject: [PATCH 033/130] maximum number of characters in content without html tags is 2000, characters are counted and number is displayed. regex is strongly shortened. --- .../ContributionForm/ContributionForm.vue | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index c91ed9741..6fa5d705f 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -10,8 +10,10 @@ /> + {{ form.title.length }}/64 + {{ form.contentLength }}/2000 |<\/p>|

      |<\/h3>|

      |<\/h4>|
        |<\/ul>|
          |<\/ol>|
        1. |<\/li>|
          |<\/blockquote>||<\/strong>||<\/em>||<\/a>/gm, - '', - ).length > 3 - ) { + this.n = value.replace(/<\/?[^>]+(>|$)/gm, '').length + this.form.contentLength = this.n + + if (this.n > 3 && this.n < 2000) { this.disabled = false } - - this.$refs.contributionForm.update('content', value) }, availableLocales() { orderBy(locales, 'name').map(locale => { From 2a76e9b18a3756e6bb0fde6f33242b7c14860872 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Tue, 2 Jul 2019 19:36:20 -0300 Subject: [PATCH 034/130] Add service yaml for nginx(maintenance) service --- deployment/human-connection/service-nginx.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 deployment/human-connection/service-nginx.yaml diff --git a/deployment/human-connection/service-nginx.yaml b/deployment/human-connection/service-nginx.yaml new file mode 100644 index 000000000..2cfe986f6 --- /dev/null +++ b/deployment/human-connection/service-nginx.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: nitro-web + namespace: human-connection + labels: + human-connection.org/selector: deployment-human-connection-web +spec: + ports: + - name: web + port: 3000 + targetPort: 3000 + selector: + human-connection.org/selector: nginx From c79ec1f6fe7bbfde8a5c33de41394fe6c8fbf58a Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 12:13:45 -0300 Subject: [PATCH 035/130] Add nginx maintenance and test locally --- .../human-connection/maintenance/Dockerfile | 2 + .../maintenance/deployment-maintenance.yaml | 37 +++++++++++++++++++ .../maintenance/maintenance.html | 4 ++ .../maintenance/service-maintenance.yaml | 14 +++++++ .../human-connection/service-nginx.yaml | 14 ------- docker-compose.yml | 8 ++++ 6 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 deployment/human-connection/maintenance/Dockerfile create mode 100644 deployment/human-connection/maintenance/deployment-maintenance.yaml create mode 100644 deployment/human-connection/maintenance/maintenance.html create mode 100644 deployment/human-connection/maintenance/service-maintenance.yaml delete mode 100644 deployment/human-connection/service-nginx.yaml diff --git a/deployment/human-connection/maintenance/Dockerfile b/deployment/human-connection/maintenance/Dockerfile new file mode 100644 index 000000000..ad9298b72 --- /dev/null +++ b/deployment/human-connection/maintenance/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:alpine +COPY ./maintenance.html /usr/share/nginx/html/index.html diff --git a/deployment/human-connection/maintenance/deployment-maintenance.yaml b/deployment/human-connection/maintenance/deployment-maintenance.yaml new file mode 100644 index 000000000..3bcdb7bf0 --- /dev/null +++ b/deployment/human-connection/maintenance/deployment-maintenance.yaml @@ -0,0 +1,37 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: maintenance + namespace: human-connection +spec: + replicas: 2 + minReadySeconds: 15 + progressDeadlineSeconds: 60 + selector: + matchLabels: + human-connection.org/selector: deployment-human-connection-nginx + template: + metadata: + labels: + human-connection.org/commit: COMMIT + human-connection.org/selector: deployment-human-connection-nginx + name: maintenance + spec: + containers: + - name: web + envFrom: + - configMapRef: + name: configmap + - secretRef: + name: human-connection + env: + - name: HOST + value: 0.0.0.0 + image: humanconnection/maintenance:latest + ports: + - containerPort: 80 + resources: {} + imagePullPolicy: Always + restartPolicy: Always + terminationGracePeriodSeconds: 30 +status: {} diff --git a/deployment/human-connection/maintenance/maintenance.html b/deployment/human-connection/maintenance/maintenance.html new file mode 100644 index 000000000..a59c639f4 --- /dev/null +++ b/deployment/human-connection/maintenance/maintenance.html @@ -0,0 +1,4 @@ +

          + At the moment we are doing some scheduled maintenance, please try again later. + Any questions or concerns, send an email to info@human-connection.org +

          diff --git a/deployment/human-connection/maintenance/service-maintenance.yaml b/deployment/human-connection/maintenance/service-maintenance.yaml new file mode 100644 index 000000000..34bef9b68 --- /dev/null +++ b/deployment/human-connection/maintenance/service-maintenance.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + name: maintenance + namespace: human-connection + labels: + human-connection.org/selector: deployment-human-connection-nginx +spec: + ports: + - name: web + port: 80 + targetPort: 80 + selector: + human-connection.org/selector: deployment-human-connection-nginx diff --git a/deployment/human-connection/service-nginx.yaml b/deployment/human-connection/service-nginx.yaml deleted file mode 100644 index 2cfe986f6..000000000 --- a/deployment/human-connection/service-nginx.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: nitro-web - namespace: human-connection - labels: - human-connection.org/selector: deployment-human-connection-web -spec: - ports: - - name: web - port: 3000 - targetPort: 3000 - selector: - human-connection.org/selector: nginx diff --git a/docker-compose.yml b/docker-compose.yml index ca66217c2..86d3d4b2a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,14 @@ services: context: neo4j networks: - hc-network + maintenance: + image: humanconnection/maintenance:latest + build: + context: deployment/human-connection/maintenance + networks: + - hc-network + ports: + - 80:80 networks: hc-network: From 6d5ffc0464f2be40a6a8e2040ac1ee7745b26613 Mon Sep 17 00:00:00 2001 From: Matt Rider Date: Wed, 3 Jul 2019 14:54:19 -0300 Subject: [PATCH 036/130] Rename labels, decrease replicas to 1 --- .../maintenance/deployment-maintenance.yaml | 6 +++--- .../human-connection/maintenance/service-maintenance.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deployment/human-connection/maintenance/deployment-maintenance.yaml b/deployment/human-connection/maintenance/deployment-maintenance.yaml index 3bcdb7bf0..4fe519997 100644 --- a/deployment/human-connection/maintenance/deployment-maintenance.yaml +++ b/deployment/human-connection/maintenance/deployment-maintenance.yaml @@ -4,17 +4,17 @@ metadata: name: maintenance namespace: human-connection spec: - replicas: 2 + replicas: 1 minReadySeconds: 15 progressDeadlineSeconds: 60 selector: matchLabels: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance template: metadata: labels: human-connection.org/commit: COMMIT - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance name: maintenance spec: containers: diff --git a/deployment/human-connection/maintenance/service-maintenance.yaml b/deployment/human-connection/maintenance/service-maintenance.yaml index 34bef9b68..43aab9331 100644 --- a/deployment/human-connection/maintenance/service-maintenance.yaml +++ b/deployment/human-connection/maintenance/service-maintenance.yaml @@ -4,11 +4,11 @@ metadata: name: maintenance namespace: human-connection labels: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance spec: ports: - name: web port: 80 targetPort: 80 selector: - human-connection.org/selector: deployment-human-connection-nginx + human-connection.org/selector: deployment-human-connection-maintenance From 97aaff92a5c4b494b35b651a3f6e47c01cbffed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 10 Jul 2019 10:31:33 +0200 Subject: [PATCH 037/130] Remove unnecessary config --- .../maintenance/deployment-maintenance.yaml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/deployment/human-connection/maintenance/deployment-maintenance.yaml b/deployment/human-connection/maintenance/deployment-maintenance.yaml index 4fe519997..fbbeec639 100644 --- a/deployment/human-connection/maintenance/deployment-maintenance.yaml +++ b/deployment/human-connection/maintenance/deployment-maintenance.yaml @@ -4,9 +4,6 @@ metadata: name: maintenance namespace: human-connection spec: - replicas: 1 - minReadySeconds: 15 - progressDeadlineSeconds: 60 selector: matchLabels: human-connection.org/selector: deployment-human-connection-maintenance @@ -19,19 +16,12 @@ spec: spec: containers: - name: web - envFrom: - - configMapRef: - name: configmap - - secretRef: - name: human-connection env: - name: HOST value: 0.0.0.0 image: humanconnection/maintenance:latest ports: - containerPort: 80 - resources: {} imagePullPolicy: Always restartPolicy: Always terminationGracePeriodSeconds: 30 -status: {} From a87330ef9b5617622a161ef6689b2760fc4a1488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 10 Jul 2019 10:33:21 +0200 Subject: [PATCH 038/130] Update maintenance docker image on master build --- scripts/docker_push.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/docker_push.sh b/scripts/docker_push.sh index c70367005..fe644c52a 100755 --- a/scripts/docker_push.sh +++ b/scripts/docker_push.sh @@ -4,7 +4,9 @@ docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT --target production -t huma docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT --target production -t humanconnection/nitro-web:latest $TRAVIS_BUILD_DIR/webapp docker build --build-arg BUILD_COMMIT=$TRAVIS_COMMIT -t humanconnection/neo4j:latest $TRAVIS_BUILD_DIR/neo4j docker build -t humanconnection/maintenance-worker:latest $TRAVIS_BUILD_DIR/deployment/legacy-migration/maintenance-worker +docker build -t humanconnection/maintenance:latest $TRAVIS_BUILD_DIR/deployment/human-connection/maintenance docker push humanconnection/nitro-backend:latest docker push humanconnection/nitro-web:latest docker push humanconnection/neo4j:latest -docker push humanconnection/maintenance-worker:latest \ No newline at end of file +docker push humanconnection/maintenance-worker:latest +docker push humanconnection/maintenance:latest From 2e9c4ad40a80831ac80ca29677c113043b6b28d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Wed, 10 Jul 2019 10:47:42 +0200 Subject: [PATCH 039/130] Add documentation how to enable maintenance mode --- SUMMARY.md | 1 + .../human-connection/maintenance/README.md | 43 +++++++++++++++++++ .../volumes/neo4j-offline-backup/README.md | 6 +-- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 deployment/human-connection/maintenance/README.md diff --git a/SUMMARY.md b/SUMMARY.md index c281e2fae..10d997a32 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -28,6 +28,7 @@ * [HTTPS](deployment/digital-ocean/https/README.md) * [Human Connection](deployment/human-connection/README.md) * [Mailserver](deployment/human-connection/mailserver/README.md) + * [Maintenance](deployment/human-connection/maintenance/README.md) * [Volumes](deployment/volumes/README.md) * [Neo4J Offline-Backups](deployment/volumes/neo4j-offline-backup/README.md) * [Volume Snapshots](deployment/volumes/volume-snapshots/README.md) diff --git a/deployment/human-connection/maintenance/README.md b/deployment/human-connection/maintenance/README.md new file mode 100644 index 000000000..02bcb44e2 --- /dev/null +++ b/deployment/human-connection/maintenance/README.md @@ -0,0 +1,43 @@ +# Maintenance mode + +> Despite our best efforts, systems sometimes require downtime for a variety of reasons. + +Quote from [here](https://www.nrmitchi.com/2017/11/easy-maintenance-mode-in-kubernetes/) + +We use our maintenance mode for manual database backup and restore. Also we +bring the database into maintenance mode for manual database migrations. + +## Deploy the service + +We prepared sample configuration, so you can simply run: +```sh +# in folder deployment/ +kubectl apply -f human-connection/maintenance +``` + +This will fire up a maintenance service. + +## Bring application into maintenance mode + +Now if you want to have a controlled downtime and you want to bring your +application into maintenance mode, you can edit your global ingress server. + +E.g. in file `deployment/digital-ocean/https/ingress.yaml` change the following: +```yaml +... + + - host: nitro-staging.human-connection.org + http: + paths: + - path: / + backend: + # serviceName: nitro-web + serviceName: maintenance + # servicePort: 3000 + servicePort: 80 +``` + +Then run ` kubectl apply -f deployment/digital-ocean/https/ingress.yaml`. If you +want to deactivate the maintenance server, just undo the edit and apply the +configuration again. + diff --git a/deployment/volumes/neo4j-offline-backup/README.md b/deployment/volumes/neo4j-offline-backup/README.md index 3638ebc89..5d773714b 100644 --- a/deployment/volumes/neo4j-offline-backup/README.md +++ b/deployment/volumes/neo4j-offline-backup/README.md @@ -23,11 +23,7 @@ So, all we have to do is edit the kubernetes deployment of our Neo4J database and set a custom `command` every time we have to carry out tasks like backup, restore, seed etc. -{% hint style="info" %} -TODO: implement maintenance mode -{% endhint %} - -First bring the application into maintenance mode to ensure there are no +First bring the application into [maintenance mode](https://github.com/Human-Connection/Human-Connection/blob/master/deployment/human-connection/maintenance/README.md) to ensure there are no database connections left and nobody can access the application. Run the following: From f870b8ea297f6e98d5e64b44a9762e9adfcddf73 Mon Sep 17 00:00:00 2001 From: senderfm Date: Wed, 10 Jul 2019 13:30:05 +0200 Subject: [PATCH 040/130] lint ok, specs for too long and too short content and title --- .../ContributionForm/ContributionForm.spec.js | 55 +++++++++++++++++-- .../ContributionForm/ContributionForm.vue | 4 +- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 3efc7dd6d..c3a50c883 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -24,7 +24,17 @@ describe('ContributionForm.vue', () => { let mocks let propsData const postTitle = 'this is a title for a post' + const postTitleTooShort = '12' + let postTitleTooLong = '' + for (let i = 0; i < 100; i++) { + postTitleTooLong += 'x' + } const postContent = 'this is a post' + const postContentTooShort = '12' + let postContentTooLong = '' + for (let i = 0; i < 2001; i++) { + postContentTooLong += 'x' + } const imageUpload = { file: { filename: 'avataar.svg', @@ -109,15 +119,52 @@ describe('ContributionForm.vue', () => { }) describe('invalid form submission', () => { - it('title required for form submission', async () => { + it('title and content should not be empty ', async () => { + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('title should not be empty', async () => { + wrapper.vm.updateEditorContent(postContent) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('title should not be too long', async () => { + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitleTooLong) + wrapper.vm.updateEditorContent(postContent) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('title should not be too short', async () => { + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitleTooShort) + wrapper.vm.updateEditorContent(postContent) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('content should not be empty', async () => { postTitleInput = wrapper.find('.ds-input') postTitleInput.setValue(postTitle) await wrapper.find('form').trigger('submit') expect(mocks.$apollo.mutate).not.toHaveBeenCalled() }) - it('content required for form submission', async () => { - wrapper.vm.updateEditorContent(postContent) + it('content should not be too long', async () => { + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitle) + wrapper.vm.updateEditorContent(postContentTooLong) + await wrapper.find('form').trigger('submit') + expect(mocks.$apollo.mutate).not.toHaveBeenCalled() + }) + + it('content should not be too short', async () => { + postTitleInput = wrapper.find('.ds-input') + postTitleInput.setValue(postTitle) + wrapper.vm.updateEditorContent(postContentTooShort) await wrapper.find('form').trigger('submit') expect(mocks.$apollo.mutate).not.toHaveBeenCalled() }) @@ -187,7 +234,7 @@ describe('ContributionForm.vue', () => { it('calls $router.back() when cancel button clicked', () => { cancelBtn = wrapper.find('.cancel-button') cancelBtn.trigger('click') - expect(mocks.$router.back).toHaveBeenCalledTimes(0) + expect(mocks.$router.back).toHaveBeenCalledTimes(1) }) }) diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 6fa5d705f..7eed255a2 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -36,7 +36,7 @@
          ]+(>|$)/gm, '').length this.form.contentLength = this.n - if (this.n > 3 && this.n < 2000) { + if (this.n > this.formSchema.content.min && this.n < this.formSchema.content.max) { this.disabled = false } }, From f7ec19f9607f026e31e626e651f837b4c1d75f81 Mon Sep 17 00:00:00 2001 From: senderfm Date: Wed, 10 Jul 2019 13:58:11 +0200 Subject: [PATCH 041/130] merge master --- .travis.yml | 7 +- CONTRIBUTING.md | 15 +- README.md | 2 +- backend/.env.template | 2 +- backend/Dockerfile | 2 +- backend/package.json | 24 +- backend/src/bootstrap/neo4j.js | 10 + backend/src/bootstrap/neode.js | 9 + backend/src/helpers/encryptPassword.js | 7 + backend/src/jest/helpers.js | 11 +- .../src/middleware/activityPubMiddleware.js | 2 +- backend/src/middleware/dateTimeMiddleware.js | 1 - .../src/middleware/email/emailMiddleware.js | 57 ++ .../email/templates/passwordReset.js | 85 +++ .../src/middleware/email/templates/signup.js | 42 ++ .../handleHtmlContent/handleContentData.js | 69 ++ .../handleContentData.spec.js | 286 +++++++++ .../hashtags/extractHashtags.js | 28 + .../hashtags/extractHashtags.spec.js | 57 ++ .../notifications/extractMentionedUsers.js} | 0 .../extractMentionedUsers.spec.js} | 20 +- backend/src/middleware/index.js | 16 +- backend/src/middleware/notifications/index.js | 30 - backend/src/middleware/notifications/spec.js | 130 ---- backend/src/middleware/passwordMiddleware.js | 21 - .../src/middleware/permissionsMiddleware.js | 43 +- backend/src/middleware/sluggifyMiddleware.js | 8 +- .../src/middleware/slugifyMiddleware.spec.js | 34 +- backend/src/middleware/userMiddleware.js | 2 +- backend/src/middleware/validation/index.js | 13 - .../validation/validationMiddleware.js | 22 + backend/src/models/EmailAddress.js | 12 + backend/src/models/InvitationCode.js | 16 + backend/src/models/User.js | 54 ++ backend/src/models/User.spec.js | 20 + backend/src/models/index.js | 7 + backend/src/schema/index.js | 6 +- backend/src/schema/resolvers/comments.spec.js | 47 +- .../src/schema/resolvers/moderation.spec.js | 2 +- backend/src/schema/resolvers/passwordReset.js | 36 +- backend/src/schema/resolvers/posts.spec.js | 45 +- backend/src/schema/resolvers/registration.js | 107 ++++ .../src/schema/resolvers/registration.spec.js | 402 ++++++++++++ .../src/schema/resolvers/socialMedia.spec.js | 9 +- .../src/schema/resolvers/user_management.js | 35 +- .../schema/resolvers/user_management.spec.js | 119 ---- backend/src/schema/resolvers/users.js | 122 +++- backend/src/schema/resolvers/users.spec.js | 67 +- backend/src/schema/types/schema.gql | 2 - .../src/schema/types/type/EmailAddress.gql | 23 + .../src/schema/types/type/InvitationCode.gql | 13 + backend/src/schema/types/type/User.gql | 98 ++- backend/src/seed/factories/index.js | 30 +- backend/src/seed/factories/users.js | 63 +- backend/src/seed/seed-db.js | 601 ++++++++++++++---- backend/yarn.lock | 398 ++++++++---- cypress/features.md | 25 +- cypress/integration/common/steps.js | 11 +- cypress/integration/search/Search.feature | 6 +- cypress/support/factories.js | 11 +- .../human-connection/deployment-neo4j.yaml | 18 +- .../templates/configmap.template.yaml | 3 +- edit-this-documentation.md | 11 +- neo4j/README.md | 16 +- package.json | 7 +- webapp/Dockerfile | 2 +- webapp/README.md | 2 +- webapp/assets.md | 5 +- webapp/assets/styles/main.scss | 3 +- webapp/components.md | 3 - .../ContributionForm/ContributionForm.vue | 42 +- .../Editor/{spec.js => Editor.spec.js} | 6 +- .../Editor/{index.vue => Editor.vue} | 211 +++++- webapp/components/Editor/nodes/Hashtag.js | 44 ++ webapp/components/Editor/nodes/Mention.js | 4 + webapp/components/FilterMenu/FilterMenu.vue | 32 +- webapp/components/Password/Change.spec.js | 14 +- webapp/components/Password/Change.vue | 66 +- .../PasswordReset/ChangePassword.spec.js | 6 +- .../PasswordReset/ChangePassword.vue | 114 ++-- webapp/components/PostCard/index.vue | 9 + .../Registration/CreateUserAccount.spec.js | 132 ++++ .../Registration/CreateUserAccount.vue | 142 +++++ webapp/components/Registration/Signup.spec.js | 146 +++++ webapp/components/Registration/Signup.vue | 141 ++++ .../components/comments/CommentForm/index.vue | 2 +- webapp/components/utils/PasswordFormHelper.js | 36 ++ webapp/graphql/PostMutations.js | 1 - webapp/layouts.md | 3 - webapp/layouts/default.vue | 33 +- webapp/locales/de.json | 58 +- webapp/locales/en.json | 61 +- webapp/locales/es.json | 17 +- webapp/locales/fr.json | 15 + webapp/locales/it.json | 17 +- webapp/locales/nl.json | 17 +- webapp/locales/pl.json | 17 +- webapp/locales/pt.json | 18 +- webapp/middleware.md | 5 +- webapp/nuxt.config.js | 8 +- webapp/package.json | 12 +- webapp/pages/admin.vue | 8 +- webapp/pages/admin/invite.vue | 23 + webapp/pages/changelog.vue | 24 + webapp/pages/imprint.vue | 82 +++ webapp/pages/index.vue | 26 +- webapp/pages/login.vue | 2 +- webapp/pages/privacy.vue | 23 + webapp/pages/registration.vue | 14 + .../registration/create-user-account.vue | 27 + webapp/pages/search/hashtag/_id.vue | 12 + webapp/pages/terms-and-conditions.vue | 23 + webapp/plugins.md | 3 - webapp/plugins/vue-filters.js | 10 - webapp/static.md | 5 +- webapp/store.md | 5 +- webapp/yarn.lock | 221 ++++--- yarn.lock | 111 +++- 118 files changed, 4291 insertions(+), 1269 deletions(-) create mode 100644 backend/src/bootstrap/neode.js create mode 100644 backend/src/helpers/encryptPassword.js create mode 100644 backend/src/middleware/email/emailMiddleware.js create mode 100644 backend/src/middleware/email/templates/passwordReset.js create mode 100644 backend/src/middleware/email/templates/signup.js create mode 100644 backend/src/middleware/handleHtmlContent/handleContentData.js create mode 100644 backend/src/middleware/handleHtmlContent/handleContentData.spec.js create mode 100644 backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.js create mode 100644 backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.spec.js rename backend/src/middleware/{notifications/extractIds/index.js => handleHtmlContent/notifications/extractMentionedUsers.js} (100%) rename backend/src/middleware/{notifications/extractIds/spec.js => handleHtmlContent/notifications/extractMentionedUsers.spec.js} (79%) delete mode 100644 backend/src/middleware/notifications/index.js delete mode 100644 backend/src/middleware/notifications/spec.js delete mode 100644 backend/src/middleware/passwordMiddleware.js create mode 100644 backend/src/middleware/validation/validationMiddleware.js create mode 100644 backend/src/models/EmailAddress.js create mode 100644 backend/src/models/InvitationCode.js create mode 100644 backend/src/models/User.js create mode 100644 backend/src/models/User.spec.js create mode 100644 backend/src/models/index.js create mode 100644 backend/src/schema/resolvers/registration.js create mode 100644 backend/src/schema/resolvers/registration.spec.js create mode 100644 backend/src/schema/types/type/EmailAddress.gql create mode 100644 backend/src/schema/types/type/InvitationCode.gql rename webapp/components/Editor/{spec.js => Editor.spec.js} (94%) rename webapp/components/Editor/{index.vue => Editor.vue} (67%) create mode 100644 webapp/components/Editor/nodes/Hashtag.js create mode 100644 webapp/components/Registration/CreateUserAccount.spec.js create mode 100644 webapp/components/Registration/CreateUserAccount.vue create mode 100644 webapp/components/Registration/Signup.spec.js create mode 100644 webapp/components/Registration/Signup.vue create mode 100644 webapp/components/utils/PasswordFormHelper.js create mode 100644 webapp/pages/admin/invite.vue create mode 100644 webapp/pages/changelog.vue create mode 100644 webapp/pages/imprint.vue create mode 100644 webapp/pages/privacy.vue create mode 100644 webapp/pages/registration.vue create mode 100644 webapp/pages/registration/create-user-account.vue create mode 100644 webapp/pages/search/hashtag/_id.vue create mode 100644 webapp/pages/terms-and-conditions.vue diff --git a/.travis.yml b/.travis.yml index f48b0bb36..593b83e5f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,9 +29,10 @@ script: - docker-compose exec backend yarn run test:jest --ci --verbose=false --coverage - docker-compose exec backend yarn run db:reset - docker-compose exec backend yarn run db:seed - - docker-compose exec backend yarn run test:cucumber --tags "not @wip" - - docker-compose exec backend yarn run db:reset - - docker-compose exec backend yarn run db:seed + # ActivityPub cucumber testing temporarily disabled because it's too buggy + # - docker-compose exec backend yarn run test:cucumber --tags "not @wip" + # - docker-compose exec backend yarn run db:reset + # - docker-compose exec backend yarn run db:seed # Frontend - docker-compose exec webapp yarn run lint - docker-compose exec webapp yarn run test --ci --verbose=false --coverage diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 19aaf3301..0eb90a824 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,9 @@ Thanks so much for thinking of contributing to the Human Connection project, we ## Getting Set Up -Instructions for how to install all the necessary software can be found in our [documentation](https://docs.human-connection.org/human-connection/) +Instructions for how to install all the necessary software can be found in our [documentation](https://docs.human-connection.org/human-connection/). -We recommend that new folks should ideally work together with an existing developer. Please join our discord instance to chat with developers or just ask them in tickets in [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f/boards?repos=152252353): +We recommend that new folks should ideally work together with an existing developer. Please join our [discord](https://discord.gg/6ub73U3) instance to chat with developers or just ask them in tickets in [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f/boards?repos=152252353): ![](https://dl.dropbox.com/s/vbmcihkduy9dhko/Screenshot%202019-01-03%2015.50.11.png?dl=0) @@ -17,7 +17,7 @@ Here are some general notes on our development flow: * Currently operating in two week sprints * We are using ZenHub to coordinate * estimating time per issue is the crucial feature of [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f) that Github does not have - * "up-for-grabs" links to [Github project](https://github.com/orgs/Human-Connection/projects/10?card_filter_query=label%3A"good+first+issue) + * "up-for-grabs" links to [Github project](https://github.com/Human-Connection/Human-Connection/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) * ordering on ZenHub not necessarily reflected on github projects * AgileVentures run open pairing sessions at 10:30am UTC each week on Tuesdays and Thursdays * Core team @@ -51,19 +51,19 @@ But what do we do when waiting for merge into master \(wanting to keep PRs small * solutions * 1\) put 2nd PR into branch that the first PR is hitting - but requires update after merging * 2\) prefer to leave exiting PR until it can be reviewed, and instead go and work on some other part of the codebase that is not impacted by the first PR - + ### Code Review -* Github setting in place - at least one review is required to merge +* Github setting in place - at least one review is required to merge - in principle anyone (who is not the PR owner) can review - but often it will be the core developers (Robert, Ulf, Greg, Wolfgang?) - once there is a review, and presuming no requested changes, PR opener can merge * CI/tests - - the CI needs to pass + - the CI needs to pass - linting <-- autofix? - tests (unit, feature) (backend, frontend) - codecoverage - + ## Notes question: when you want to pick a task - \(find out priority\) - is it in discord? is it in AV slack? --> Robert says you can always ask in discord - group channels are the best @@ -77,4 +77,3 @@ Matt makes point that new stories will have to be taken off the "New Issues" and Robert notes that everyone is invited to join the kickoff meetings Robert - difference between "important" \(creates a lot of value\) and "beginner friendly" \(easy to implement\) - diff --git a/README.md b/README.md index ac7d2a024..411f7d842 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Thank you lokalise for providing us with a premium account :raised_hands:. ## Developer Chat Join our friendly open-source community on [Discord](https://discord.gg/6ub73U3) :heart_eyes_cat: -Just introduce yourself at `#user-presentation` and mention `@@Mentor` to get you onboard :neckbeard: +Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: Check out the [contribution guideline](./CONTRIBUTING.md), too! diff --git a/backend/.env.template b/backend/.env.template index 0c80529a1..594c7b28b 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -1,5 +1,5 @@ NEO4J_URI=bolt://localhost:7687 -NEO4J_USER=neo4j +NEO4J_USERNAME=neo4j NEO4J_PASSWORD=letmein GRAPHQL_PORT=4000 GRAPHQL_URI=http://localhost:4000 diff --git a/backend/Dockerfile b/backend/Dockerfile index 2e8667461..935077c98 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12.5-alpine as base +FROM node:12.6-alpine as base LABEL Description="Backend of the Social Network Human-Connection.org" Vendor="Human Connection gGmbH" Version="0.0.1" Maintainer="Human Connection gGmbH (developer@human-connection.org)" EXPOSE 4000 diff --git a/backend/package.json b/backend/package.json index 599e8eac6..0b9e25447 100644 --- a/backend/package.json +++ b/backend/package.json @@ -42,35 +42,37 @@ ] }, "dependencies": { + "@hapi/joi": "^15.1.0", "activitystrea.ms": "~2.1.3", "apollo-cache-inmemory": "~1.6.2", "apollo-client": "~2.6.3", "apollo-link-context": "~1.0.18", "apollo-link-http": "~1.5.15", - "apollo-server": "~2.6.7", + "apollo-server": "~2.6.8", "bcryptjs": "~2.4.3", "cheerio": "~1.0.0-rc.3", "cors": "~2.8.5", "cross-env": "~5.2.0", - "date-fns": "2.0.0-beta.2", + "date-fns": "2.0.0-beta.1", "debug": "~4.1.1", "dotenv": "~8.0.0", "express": "~4.17.1", "faker": "Marak/faker.js#master", - "graphql": "~14.4.0", + "graphql": "~14.4.2", "graphql-custom-directives": "~0.2.14", "graphql-iso-date": "~3.6.1", "graphql-middleware": "~3.0.2", - "graphql-shield": "~6.0.2", + "graphql-shield": "~6.0.3", "graphql-tag": "~2.10.1", "graphql-yoga": "~1.18.0", "helmet": "~3.18.0", "jsonwebtoken": "~8.5.1", "linkifyjs": "~2.1.8", - "lodash": "~4.17.11", + "lodash": "~4.17.13", "merge-graphql-schemas": "^1.5.8", "neo4j-driver": "~1.7.4", "neo4j-graphql-js": "^2.6.3", + "neode": "^0.2.16", "node-fetch": "~2.6.0", "nodemailer": "^6.2.1", "npm-run-all": "~4.1.5", @@ -82,13 +84,13 @@ "wait-on": "~3.2.0" }, "devDependencies": { - "@babel/cli": "~7.4.4", - "@babel/core": "~7.4.5", - "@babel/node": "~7.4.5", + "@babel/cli": "~7.5.0", + "@babel/core": "~7.5.4", + "@babel/node": "~7.5.0", "@babel/plugin-proposal-throw-expressions": "^7.2.0", - "@babel/preset-env": "~7.4.5", + "@babel/preset-env": "~7.5.4", "@babel/register": "~7.4.4", - "apollo-server-testing": "~2.6.7", + "apollo-server-testing": "~2.6.8", "babel-core": "~7.0.0-0", "babel-eslint": "~10.0.2", "babel-jest": "~24.8.0", @@ -98,7 +100,7 @@ "eslint-config-prettier": "~6.0.0", "eslint-config-standard": "~12.0.0", "eslint-plugin-import": "~2.18.0", - "eslint-plugin-jest": "~22.7.1", + "eslint-plugin-jest": "~22.7.2", "eslint-plugin-node": "~9.1.0", "eslint-plugin-prettier": "~3.1.0", "eslint-plugin-promise": "~4.2.1", diff --git a/backend/src/bootstrap/neo4j.js b/backend/src/bootstrap/neo4j.js index bfa68acf3..f9e3a997d 100644 --- a/backend/src/bootstrap/neo4j.js +++ b/backend/src/bootstrap/neo4j.js @@ -1,5 +1,6 @@ import { v1 as neo4j } from 'neo4j-driver' import CONFIG from './../config' +import setupNeode from './neode' let driver @@ -14,3 +15,12 @@ export function getDriver(options = {}) { } return driver } + +let neodeInstance +export function neode() { + if (!neodeInstance) { + const { NEO4J_URI: uri, NEO4J_USERNAME: username, NEO4J_PASSWORD: password } = CONFIG + neodeInstance = setupNeode({ uri, username, password }) + } + return neodeInstance +} diff --git a/backend/src/bootstrap/neode.js b/backend/src/bootstrap/neode.js new file mode 100644 index 000000000..65a2074be --- /dev/null +++ b/backend/src/bootstrap/neode.js @@ -0,0 +1,9 @@ +import Neode from 'neode' +import models from '../models' + +export default function setupNeode(options) { + const { uri, username, password } = options + const neodeInstance = new Neode(uri, username, password) + neodeInstance.with(models) + return neodeInstance +} diff --git a/backend/src/helpers/encryptPassword.js b/backend/src/helpers/encryptPassword.js new file mode 100644 index 000000000..ae98af84f --- /dev/null +++ b/backend/src/helpers/encryptPassword.js @@ -0,0 +1,7 @@ +import { hashSync } from 'bcryptjs' + +export default function(args) { + args.encryptedPassword = hashSync(args.password, 10) + delete args.password + return args +} diff --git a/backend/src/jest/helpers.js b/backend/src/jest/helpers.js index d07bc9ad1..e50f30c64 100644 --- a/backend/src/jest/helpers.js +++ b/backend/src/jest/helpers.js @@ -4,12 +4,13 @@ import { request } from 'graphql-request' // not to be confused with the seeder host export const host = 'http://127.0.0.1:4123' -export async function login({ email, password }) { +export async function login(variables) { const mutation = ` - mutation { - login(email:"${email}", password:"${password}") - }` - const response = await request(host, mutation) + mutation($email: String!, $password: String!) { + login(email: $email, password: $password) + } + ` + const response = await request(host, mutation, variables) return { authorization: `Bearer ${response.login}`, } diff --git a/backend/src/middleware/activityPubMiddleware.js b/backend/src/middleware/activityPubMiddleware.js index f3ced42f9..e6fb2385c 100644 --- a/backend/src/middleware/activityPubMiddleware.js +++ b/backend/src/middleware/activityPubMiddleware.js @@ -46,7 +46,7 @@ export default { } return post }, - CreateUser: async (resolve, root, args, context, info) => { + SignupVerification: async (resolve, root, args, context, info) => { const keys = generateRsaKeyPair() Object.assign(args, keys) args.actorId = `${activityPub.host}/activitypub/users/${args.slug}` diff --git a/backend/src/middleware/dateTimeMiddleware.js b/backend/src/middleware/dateTimeMiddleware.js index ac6e0ac4a..c8af53a7a 100644 --- a/backend/src/middleware/dateTimeMiddleware.js +++ b/backend/src/middleware/dateTimeMiddleware.js @@ -9,7 +9,6 @@ const setUpdatedAt = (resolve, root, args, context, info) => { export default { Mutation: { - CreateUser: setCreatedAt, CreatePost: setCreatedAt, CreateComment: setCreatedAt, CreateOrganization: setCreatedAt, diff --git a/backend/src/middleware/email/emailMiddleware.js b/backend/src/middleware/email/emailMiddleware.js new file mode 100644 index 000000000..0b7cfd058 --- /dev/null +++ b/backend/src/middleware/email/emailMiddleware.js @@ -0,0 +1,57 @@ +import CONFIG from '../../config' +import nodemailer from 'nodemailer' +import { resetPasswordMail, wrongAccountMail } from './templates/passwordReset' +import { signupTemplate } from './templates/signup' + +const transporter = () => { + const configs = { + host: CONFIG.SMTP_HOST, + port: CONFIG.SMTP_PORT, + ignoreTLS: CONFIG.SMTP_IGNORE_TLS, + secure: false, // true for 465, false for other ports + } + const { SMTP_USERNAME: user, SMTP_PASSWORD: pass } = CONFIG + if (user && pass) { + configs.auth = { user, pass } + } + return nodemailer.createTransport(configs) +} + +const returnResponse = async (resolve, root, args, context, resolveInfo) => { + const { response } = await resolve(root, args, context, resolveInfo) + delete response.nonce + return response +} + +const sendSignupMail = async (resolve, root, args, context, resolveInfo) => { + const { email } = args + const { response, nonce } = await resolve(root, args, context, resolveInfo) + delete response.nonce + await transporter().sendMail(signupTemplate({ email, nonce })) + return response +} + +export default function({ isEnabled }) { + if (!isEnabled) + return { + Mutation: { + requestPasswordReset: returnResponse, + Signup: returnResponse, + SignupByInvitation: returnResponse, + }, + } + + return { + Mutation: { + requestPasswordReset: async (resolve, root, args, context, resolveInfo) => { + const { email } = args + const { response, user, code, name } = await resolve(root, args, context, resolveInfo) + const mailTemplate = user ? resetPasswordMail : wrongAccountMail + await transporter().sendMail(mailTemplate({ email, code, name })) + return response + }, + Signup: sendSignupMail, + SignupByInvitation: sendSignupMail, + }, + } +} diff --git a/backend/src/middleware/email/templates/passwordReset.js b/backend/src/middleware/email/templates/passwordReset.js new file mode 100644 index 000000000..8508adccc --- /dev/null +++ b/backend/src/middleware/email/templates/passwordReset.js @@ -0,0 +1,85 @@ +import CONFIG from '../../../config' + +export const from = '"Human Connection" ' + +export const resetPasswordMail = options => { + const { + name, + email, + code, + subject = 'Use this link to reset your password. The link is only valid for 24 hours.', + supportUrl = 'https://human-connection.org/en/contact/', + } = options + const actionUrl = new URL('/password-reset/change-password', CONFIG.CLIENT_URI) + actionUrl.searchParams.set('code', code) + actionUrl.searchParams.set('email', email) + + return { + to: email, + subject, + text: ` +Hi ${name}! + +You recently requested to reset your password for your Human Connection account. +Use the link below to reset it. This password reset is only valid for the next +24 hours. + +${actionUrl} + +If you did not request a password reset, please ignore this email or contact +support if you have questions: + +${supportUrl} + +Thanks, +The Human Connection Team + +If you're having trouble with the link above, you can manually copy and +paste the following code into your browser window: + +${code} + +Human Connection gemeinnützige GmbH +Bahnhofstr. 11 +73235 Weilheim / Teck +Deutschland + `, + } +} + +export const wrongAccountMail = options => { + const { + email, + subject = `We received a request to reset your password with this email address (${email})`, + supportUrl = 'https://human-connection.org/en/contact/', + } = options + const actionUrl = new URL('/password-reset/request', CONFIG.CLIENT_URI) + return { + to: email, + subject, + text: ` +We received a request to reset the password to access Human Connection with your +email address, but we were unable to find an account associated with this +address. + +If you use Human Connection and were expecting this email, consider trying to +request a password reset using the email address associated with your account. +Try a different email: + +${actionUrl} + +If you do not use Human Connection or did not request a password reset, please +ignore this email. Feel free to contact support if you have further questions: + +${supportUrl} + +Thanks, +The Human Connection Team + +Human Connection gemeinnützige GmbH +Bahnhofstr. 11 +73235 Weilheim / Teck +Deutschland + `, + } +} diff --git a/backend/src/middleware/email/templates/signup.js b/backend/src/middleware/email/templates/signup.js new file mode 100644 index 000000000..1a9c0de91 --- /dev/null +++ b/backend/src/middleware/email/templates/signup.js @@ -0,0 +1,42 @@ +import CONFIG from '../../../config' + +export const from = '"Human Connection" ' + +export const signupTemplate = options => { + const { + email, + nonce, + subject = 'Signup link', + supportUrl = 'https://human-connection.org/en/contact/', + } = options + const actionUrl = new URL('/registration/create-user-account', CONFIG.CLIENT_URI) + actionUrl.searchParams.set('nonce', nonce) + + return { + to: email, + subject, + text: ` +Welcome to Human Connection! Use this link to complete the registration process +and create a user account: + +${actionUrl} + +You can also copy+paste this verification code in your browser window: + +${nonce} + +If you did not signed up for Human Connection, please ignore this email or +contact support if you have questions: + +${supportUrl} + +Thanks, +The Human Connection Team + +Human Connection gemeinnützige GmbH +Bahnhofstr. 11 +73235 Weilheim / Teck +Deutschland + `, + } +} diff --git a/backend/src/middleware/handleHtmlContent/handleContentData.js b/backend/src/middleware/handleHtmlContent/handleContentData.js new file mode 100644 index 000000000..6519ddae7 --- /dev/null +++ b/backend/src/middleware/handleHtmlContent/handleContentData.js @@ -0,0 +1,69 @@ +import extractMentionedUsers from './notifications/extractMentionedUsers' +import extractHashtags from './hashtags/extractHashtags' + +const notify = async (postId, idsOfMentionedUsers, context) => { + const session = context.driver.session() + const createdAt = new Date().toISOString() + const cypher = ` + match(u:User) where u.id in $idsOfMentionedUsers + match(p:Post) where p.id = $postId + create(n:Notification{id: apoc.create.uuid(), read: false, createdAt: $createdAt}) + merge (n)-[:NOTIFIED]->(u) + merge (p)-[:NOTIFIED]->(n) + ` + await session.run(cypher, { + idsOfMentionedUsers, + createdAt, + postId, + }) + session.close() +} + +const updateHashtagsOfPost = async (postId, hashtags, context) => { + const session = context.driver.session() + // We need two Cypher statements, because the 'MATCH' in the 'cypherDeletePreviousRelations' statement + // functions as an 'if'. In case there is no previous relation, the rest of the commands are omitted + // and no new Hashtags and relations will be created. + const cypherDeletePreviousRelations = ` + MATCH (p:Post { id: $postId })-[previousRelations:TAGGED]->(t:Tag) + DELETE previousRelations + RETURN p, t + ` + const cypherCreateNewTagsAndRelations = ` + MATCH (p:Post { id: $postId}) + UNWIND $hashtags AS tagName + MERGE (t:Tag { id: tagName, name: tagName, disabled: false, deleted: false }) + MERGE (p)-[:TAGGED]->(t) + RETURN p, t + ` + await session.run(cypherDeletePreviousRelations, { + postId, + }) + await session.run(cypherCreateNewTagsAndRelations, { + postId, + hashtags, + }) + session.close() +} + +const handleContentData = async (resolve, root, args, context, resolveInfo) => { + // extract user ids before xss-middleware removes classes via the following "resolve" call + const idsOfMentionedUsers = extractMentionedUsers(args.content) + // extract tag (hashtag) ids before xss-middleware removes classes via the following "resolve" call + const hashtags = extractHashtags(args.content) + + // removes classes from the content + const post = await resolve(root, args, context, resolveInfo) + + await notify(post.id, idsOfMentionedUsers, context) + await updateHashtagsOfPost(post.id, hashtags, context) + + return post +} + +export default { + Mutation: { + CreatePost: handleContentData, + UpdatePost: handleContentData, + }, +} diff --git a/backend/src/middleware/handleHtmlContent/handleContentData.spec.js b/backend/src/middleware/handleHtmlContent/handleContentData.spec.js new file mode 100644 index 000000000..aa281e6d7 --- /dev/null +++ b/backend/src/middleware/handleHtmlContent/handleContentData.spec.js @@ -0,0 +1,286 @@ +import { GraphQLClient } from 'graphql-request' +import gql from 'graphql-tag' +import { host, login } from '../../jest/helpers' +import Factory from '../../seed/factories' + +const factory = Factory() +let client + +beforeEach(async () => { + await factory.create('User', { + id: 'you', + name: 'Al Capone', + slug: 'al-capone', + email: 'test@example.org', + password: '1234', + }) +}) + +afterEach(async () => { + await factory.cleanDatabase() +}) + +describe('currentUser { notifications }', () => { + const query = gql` + query($read: Boolean) { + currentUser { + notifications(read: $read, orderBy: createdAt_desc) { + read + post { + content + } + } + } + } + ` + + describe('authenticated', () => { + let headers + beforeEach(async () => { + headers = await login({ + email: 'test@example.org', + password: '1234', + }) + client = new GraphQLClient(host, { + headers, + }) + }) + + describe('given another user', () => { + let authorClient + let authorParams + let authorHeaders + + beforeEach(async () => { + authorParams = { + email: 'author@example.org', + password: '1234', + id: 'author', + } + await factory.create('User', authorParams) + authorHeaders = await login(authorParams) + }) + + describe('who mentions me in a post', () => { + let post + const title = 'Mentioning Al Capone' + const content = + 'Hey @al-capone how do you do?' + + beforeEach(async () => { + const createPostMutation = gql` + mutation($title: String!, $content: String!) { + CreatePost(title: $title, content: $content) { + id + title + content + } + } + ` + authorClient = new GraphQLClient(host, { + headers: authorHeaders, + }) + const { CreatePost } = await authorClient.request(createPostMutation, { + title, + content, + }) + post = CreatePost + }) + + it('sends you a notification', async () => { + const expectedContent = + 'Hey @al-capone how do you do?' + const expected = { + currentUser: { + notifications: [ + { + read: false, + post: { + content: expectedContent, + }, + }, + ], + }, + } + await expect( + client.request(query, { + read: false, + }), + ).resolves.toEqual(expected) + }) + + describe('who mentions me again', () => { + beforeEach(async () => { + const updatedContent = `${post.content} One more mention to @al-capone` + // The response `post.content` contains a link but the XSSmiddleware + // should have the `mention` CSS class removed. I discovered this + // during development and thought: A feature not a bug! This way we + // can encode a re-mentioning of users when you edit your post or + // comment. + const updatePostMutation = gql` + mutation($id: ID!, $title: String!, $content: String!) { + UpdatePost(id: $id, content: $content, title: $title) { + title + content + } + } + ` + authorClient = new GraphQLClient(host, { + headers: authorHeaders, + }) + await authorClient.request(updatePostMutation, { + id: post.id, + title: post.title, + content: updatedContent, + }) + }) + + it('creates exactly one more notification', async () => { + const expectedContent = + 'Hey @al-capone how do you do? One more mention to @al-capone' + const expected = { + currentUser: { + notifications: [ + { + read: false, + post: { + content: expectedContent, + }, + }, + { + read: false, + post: { + content: expectedContent, + }, + }, + ], + }, + } + await expect( + client.request(query, { + read: false, + }), + ).resolves.toEqual(expected) + }) + }) + }) + }) + }) +}) + +describe('Hashtags', () => { + const postId = 'p135' + const postTitle = 'Two Hashtags' + const postContent = + '

          Hey Dude, #Democracy should work equal for everybody!? That seems to be the only way to have equal #Liberty for everyone.

          ' + const postWithHastagsQuery = gql` + query($id: ID) { + Post(id: $id) { + tags { + id + name + } + } + } + ` + const postWithHastagsVariables = { + id: postId, + } + const createPostMutation = gql` + mutation($postId: ID, $postTitle: String!, $postContent: String!) { + CreatePost(id: $postId, title: $postTitle, content: $postContent) { + id + title + content + } + } + ` + + describe('authenticated', () => { + let headers + beforeEach(async () => { + headers = await login({ + email: 'test@example.org', + password: '1234', + }) + client = new GraphQLClient(host, { + headers, + }) + }) + + describe('create a Post with Hashtags', () => { + beforeEach(async () => { + await client.request(createPostMutation, { + postId, + postTitle, + postContent, + }) + }) + + it('both Hashtags are created with the "id" set to thier "name"', async () => { + const expected = [ + { + id: 'Democracy', + name: 'Democracy', + }, + { + id: 'Liberty', + name: 'Liberty', + }, + ] + await expect( + client.request(postWithHastagsQuery, postWithHastagsVariables), + ).resolves.toEqual({ + Post: [ + { + tags: expect.arrayContaining(expected), + }, + ], + }) + }) + + describe('afterwards update the Post by removing a Hashtag, leaving a Hashtag and add a Hashtag', () => { + // The already existing Hashtag has no class at this point. + const updatedPostContent = + '

          Hey Dude, #Elections should work equal for everybody!? That seems to be the only way to have equal #Liberty for everyone.

          ' + const updatePostMutation = gql` + mutation($postId: ID!, $postTitle: String!, $updatedPostContent: String!) { + UpdatePost(id: $postId, title: $postTitle, content: $updatedPostContent) { + id + title + content + } + } + ` + + it('only one previous Hashtag and the new Hashtag exists', async () => { + await client.request(updatePostMutation, { + postId, + postTitle, + updatedPostContent, + }) + + const expected = [ + { + id: 'Elections', + name: 'Elections', + }, + { + id: 'Liberty', + name: 'Liberty', + }, + ] + await expect( + client.request(postWithHastagsQuery, postWithHastagsVariables), + ).resolves.toEqual({ + Post: [ + { + tags: expect.arrayContaining(expected), + }, + ], + }) + }) + }) + }) + }) +}) diff --git a/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.js b/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.js new file mode 100644 index 000000000..fd6613065 --- /dev/null +++ b/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.js @@ -0,0 +1,28 @@ +import cheerio from 'cheerio' +// formats of a Hashtag: +// https://en.wikipedia.org/w/index.php?title=Hashtag&oldid=905141980#Style +// here: +// 0. Search for whole string. +// 1. Hashtag has only 'a-z', 'A-Z', and '0-9'. +// 2. If it starts with a digit '0-9' than 'a-z', or 'A-Z' has to follow. +const ID_REGEX = /^\/search\/hashtag\/(([a-zA-Z]+[a-zA-Z0-9]*)|([0-9]+[a-zA-Z]+[a-zA-Z0-9]*))$/g + +export default function(content) { + if (!content) return [] + const $ = cheerio.load(content) + // We can not search for class '.hashtag', because the classes are removed at the 'xss' middleware. + // But we have to know, which Hashtags are removed from the content es well, so we search for the 'a' html-tag. + const urls = $('a') + .map((_, el) => { + return $(el).attr('href') + }) + .get() + const hashtags = [] + urls.forEach(url => { + let match + while ((match = ID_REGEX.exec(url)) != null) { + hashtags.push(match[1]) + } + }) + return hashtags +} diff --git a/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.spec.js b/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.spec.js new file mode 100644 index 000000000..eb581d8f5 --- /dev/null +++ b/backend/src/middleware/handleHtmlContent/hashtags/extractHashtags.spec.js @@ -0,0 +1,57 @@ +import extractHashtags from './extractHashtags' + +describe('extractHashtags', () => { + describe('content undefined', () => { + it('returns empty array', () => { + expect(extractHashtags()).toEqual([]) + }) + }) + + describe('searches through links', () => { + it('finds links with and without ".hashtag" class and extracts Hashtag names', () => { + const content = + '

          #Elections#Democracy

          ' + expect(extractHashtags(content)).toEqual(['Elections', 'Democracy']) + }) + + it('ignores mentions', () => { + const content = + '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' + expect(extractHashtags(content)).toEqual([]) + }) + + describe('handles links', () => { + it('ignores links with domains', () => { + const content = + '

          #Elections#Democracy

          ' + expect(extractHashtags(content)).toEqual(['Democracy']) + }) + + it('ignores Hashtag links with not allowed character combinations', () => { + const content = + '

          Something inspirational about #AbcDefXyz0123456789!*(),2, #0123456789, #0123456789a and #AbcDefXyz0123456789.

          ' + expect(extractHashtags(content)).toEqual(['0123456789a', 'AbcDefXyz0123456789']) + }) + }) + + describe('does not crash if', () => { + it('`href` contains no Hashtag name', () => { + const content = + '

          Something inspirational about #Democracy and #liberty.

          ' + expect(extractHashtags(content)).toEqual([]) + }) + + it('`href` contains Hashtag as page anchor', () => { + const content = + '

          Something inspirational about #anchor.

          ' + expect(extractHashtags(content)).toEqual([]) + }) + + it('`href` is empty or invalid', () => { + const content = + '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' + expect(extractHashtags(content)).toEqual([]) + }) + }) + }) +}) diff --git a/backend/src/middleware/notifications/extractIds/index.js b/backend/src/middleware/handleHtmlContent/notifications/extractMentionedUsers.js similarity index 100% rename from backend/src/middleware/notifications/extractIds/index.js rename to backend/src/middleware/handleHtmlContent/notifications/extractMentionedUsers.js diff --git a/backend/src/middleware/notifications/extractIds/spec.js b/backend/src/middleware/handleHtmlContent/notifications/extractMentionedUsers.spec.js similarity index 79% rename from backend/src/middleware/notifications/extractIds/spec.js rename to backend/src/middleware/handleHtmlContent/notifications/extractMentionedUsers.spec.js index 341c39cec..f39fbc859 100644 --- a/backend/src/middleware/notifications/extractIds/spec.js +++ b/backend/src/middleware/handleHtmlContent/notifications/extractMentionedUsers.spec.js @@ -1,9 +1,9 @@ -import extractIds from '.' +import extractMentionedUsers from './extractMentionedUsers' -describe('extractIds', () => { +describe('extractMentionedUsers', () => { describe('content undefined', () => { it('returns empty array', () => { - expect(extractIds()).toEqual([]) + expect(extractMentionedUsers()).toEqual([]) }) }) @@ -11,33 +11,33 @@ describe('extractIds', () => { it('ignores links without .mention class', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual([]) + expect(extractMentionedUsers(content)).toEqual([]) }) describe('given a link with .mention class', () => { it('extracts ids', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual(['u2', 'u3']) + expect(extractMentionedUsers(content)).toEqual(['u2', 'u3']) }) describe('handles links', () => { it('with slug and id', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual(['u2', 'u3']) + expect(extractMentionedUsers(content)).toEqual(['u2', 'u3']) }) it('with domains', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual(['u2', 'u3']) + expect(extractMentionedUsers(content)).toEqual(['u2', 'u3']) }) it('special characters', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual(['u!*(),2', 'u.~-3']) + expect(extractMentionedUsers(content)).toEqual(['u!*(),2', 'u.~-3']) }) }) @@ -45,13 +45,13 @@ describe('extractIds', () => { it('`href` contains no user id', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual([]) + expect(extractMentionedUsers(content)).toEqual([]) }) it('`href` is empty or invalid', () => { const content = '

          Something inspirational about @bob-der-baumeister and @jenny-rostock.

          ' - expect(extractIds(content)).toEqual([]) + expect(extractMentionedUsers(content)).toEqual([]) }) }) }) diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index 9b85bd340..fd631256d 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -1,6 +1,5 @@ import CONFIG from './../config' import activityPub from './activityPubMiddleware' -import password from './passwordMiddleware' import softDelete from './softDeleteMiddleware' import sluggify from './sluggifyMiddleware' import excerpt from './excerptMiddleware' @@ -10,35 +9,36 @@ import permissions from './permissionsMiddleware' import user from './userMiddleware' import includedFields from './includedFieldsMiddleware' import orderBy from './orderByMiddleware' -import validation from './validation' -import notifications from './notifications' +import validation from './validation/validationMiddleware' +import handleContentData from './handleHtmlContent/handleContentData' +import email from './email/emailMiddleware' export default schema => { const middlewares = { permissions: permissions, activityPub: activityPub, - password: password, dateTime: dateTime, validation: validation, sluggify: sluggify, excerpt: excerpt, - notifications: notifications, + handleContentData: handleContentData, xss: xss, softDelete: softDelete, user: user, includedFields: includedFields, orderBy: orderBy, + email: email({ isEnabled: CONFIG.SMTP_HOST && CONFIG.SMTP_PORT }), } let order = [ 'permissions', - 'activityPub', - 'password', + // 'activityPub', disabled temporarily 'dateTime', 'validation', 'sluggify', 'excerpt', - 'notifications', + 'email', + 'handleContentData', 'xss', 'softDelete', 'user', diff --git a/backend/src/middleware/notifications/index.js b/backend/src/middleware/notifications/index.js deleted file mode 100644 index ca460a512..000000000 --- a/backend/src/middleware/notifications/index.js +++ /dev/null @@ -1,30 +0,0 @@ -import extractIds from './extractIds' - -const notify = async (resolve, root, args, context, resolveInfo) => { - // extract user ids before xss-middleware removes link classes - const ids = extractIds(args.content) - - const post = await resolve(root, args, context, resolveInfo) - - const session = context.driver.session() - const { id: postId } = post - const createdAt = new Date().toISOString() - const cypher = ` - match(u:User) where u.id in $ids - match(p:Post) where p.id = $postId - create(n:Notification{id: apoc.create.uuid(), read: false, createdAt: $createdAt}) - merge (n)-[:NOTIFIED]->(u) - merge (p)-[:NOTIFIED]->(n) - ` - await session.run(cypher, { ids, createdAt, postId }) - session.close() - - return post -} - -export default { - Mutation: { - CreatePost: notify, - UpdatePost: notify, - }, -} diff --git a/backend/src/middleware/notifications/spec.js b/backend/src/middleware/notifications/spec.js deleted file mode 100644 index d214a5571..000000000 --- a/backend/src/middleware/notifications/spec.js +++ /dev/null @@ -1,130 +0,0 @@ -import { GraphQLClient } from 'graphql-request' -import { host, login } from '../../jest/helpers' -import Factory from '../../seed/factories' - -const factory = Factory() -let client - -beforeEach(async () => { - await factory.create('User', { - id: 'you', - name: 'Al Capone', - slug: 'al-capone', - email: 'test@example.org', - password: '1234', - }) -}) - -afterEach(async () => { - await factory.cleanDatabase() -}) - -describe('currentUser { notifications }', () => { - const query = `query($read: Boolean) { - currentUser { - notifications(read: $read, orderBy: createdAt_desc) { - read - post { - content - } - } - } - }` - - describe('authenticated', () => { - let headers - beforeEach(async () => { - headers = await login({ email: 'test@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - - describe('given another user', () => { - let authorClient - let authorParams - let authorHeaders - - beforeEach(async () => { - authorParams = { - email: 'author@example.org', - password: '1234', - id: 'author', - } - await factory.create('User', authorParams) - authorHeaders = await login(authorParams) - }) - - describe('who mentions me in a post', () => { - let post - const title = 'Mentioning Al Capone' - const content = - 'Hey @al-capone how do you do?' - - beforeEach(async () => { - const createPostMutation = ` - mutation($title: String!, $content: String!) { - CreatePost(title: $title, content: $content) { - id - title - content - } - } - ` - authorClient = new GraphQLClient(host, { headers: authorHeaders }) - const { CreatePost } = await authorClient.request(createPostMutation, { title, content }) - post = CreatePost - }) - - it('sends you a notification', async () => { - const expectedContent = - 'Hey @al-capone how do you do?' - const expected = { - currentUser: { - notifications: [{ read: false, post: { content: expectedContent } }], - }, - } - await expect(client.request(query, { read: false })).resolves.toEqual(expected) - }) - - describe('who mentions me again', () => { - beforeEach(async () => { - const updatedContent = `${post.content} One more mention to @al-capone` - const updatedTitle = 'this post has been updated' - // The response `post.content` contains a link but the XSSmiddleware - // should have the `mention` CSS class removed. I discovered this - // during development and thought: A feature not a bug! This way we - // can encode a re-mentioning of users when you edit your post or - // comment. - const updatePostMutation = ` - mutation($id: ID!, $title: String!, $content: String!) { - UpdatePost(id: $id, title: $title, content: $content) { - title - content - } - } - ` - authorClient = new GraphQLClient(host, { headers: authorHeaders }) - await authorClient.request(updatePostMutation, { - id: post.id, - content: updatedContent, - title: updatedTitle, - }) - }) - - it('creates exactly one more notification', async () => { - const expectedContent = - 'Hey @al-capone how do you do? One more mention to @al-capone' - const expected = { - currentUser: { - notifications: [ - { read: false, post: { content: expectedContent } }, - { read: false, post: { content: expectedContent } }, - ], - }, - } - await expect(client.request(query, { read: false })).resolves.toEqual(expected) - }) - }) - }) - }) - }) -}) diff --git a/backend/src/middleware/passwordMiddleware.js b/backend/src/middleware/passwordMiddleware.js deleted file mode 100644 index 1078e5529..000000000 --- a/backend/src/middleware/passwordMiddleware.js +++ /dev/null @@ -1,21 +0,0 @@ -import bcrypt from 'bcryptjs' -import walkRecursive from '../helpers/walkRecursive' - -export default { - Mutation: { - CreateUser: async (resolve, root, args, context, info) => { - args.password = await bcrypt.hashSync(args.password, 10) - const result = await resolve(root, args, context, info) - result.password = '*****' - return result - }, - }, - Query: async (resolve, root, args, context, info) => { - let result = await resolve(root, args, context, info) - result = walkRecursive(result, ['password', 'privateKey'], () => { - // replace password with asterisk - return '*****' - }) - return result - }, -} diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index af4a46d81..a6b6ef0da 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -1,4 +1,4 @@ -import { rule, shield, deny, allow, or } from 'graphql-shield' +import { rule, shield, deny, allow, and, or, not } from 'graphql-shield' /* * TODO: implement @@ -70,6 +70,29 @@ const onlyEnabledContent = rule({ return !(disabled || deleted) }) +const invitationLimitReached = rule({ + cache: 'no_cache', +})(async (parent, args, { user, driver }) => { + const session = driver.session() + try { + const result = await session.run( + ` + MATCH (user:User {id:$id})-[:GENERATED]->(i:InvitationCode) + RETURN COUNT(i) >= 3 as limitReached + `, + { id: user.id }, + ) + const [limitReached] = result.records.map(record => { + return record.get('limitReached') + }) + return limitReached + } catch (e) { + throw e + } finally { + session.close() + } +}) + const isAuthor = rule({ cache: 'no_cache', })(async (parent, args, { user, driver }) => { @@ -101,6 +124,12 @@ const isDeletingOwnAccount = rule({ return context.user.id === args.id }) +const noEmailFilter = rule({ + cache: 'no_cache', +})(async (_, args) => { + return !('email' in args) +}) + // Permissions const permissions = shield( { @@ -108,21 +137,24 @@ const permissions = shield( '*': deny, findPosts: allow, Category: allow, - Tag: isAdmin, + Tag: allow, Report: isModerator, Notification: isAdmin, statistics: allow, currentUser: allow, Post: or(onlyEnabledContent, isModerator), Comment: allow, - User: allow, + User: or(noEmailFilter, isAdmin), isLoggedIn: allow, }, Mutation: { '*': deny, login: allow, + SignupByInvitation: allow, + Signup: isAdmin, + SignupVerification: allow, + CreateInvitationCode: and(isAuthenticated, or(not(invitationLimitReached), isAdmin)), UpdateNotification: belongsToMe, - CreateUser: isAdmin, UpdateUser: onlyYourself, CreatePost: isAuthenticated, UpdatePost: isAuthor, @@ -131,7 +163,6 @@ const permissions = shield( CreateBadge: isAdmin, UpdateBadge: isAdmin, DeleteBadge: isAdmin, - AddUserBadges: isAdmin, CreateSocialMedia: isAuthenticated, DeleteSocialMedia: isAuthenticated, // AddBadgeRewarded: isAdmin, @@ -154,8 +185,6 @@ const permissions = shield( }, User: { email: isMyOwn, - password: isMyOwn, - privateKey: isMyOwn, }, }, { diff --git a/backend/src/middleware/sluggifyMiddleware.js b/backend/src/middleware/sluggifyMiddleware.js index 226bef8e5..6133a3c14 100644 --- a/backend/src/middleware/sluggifyMiddleware.js +++ b/backend/src/middleware/sluggifyMiddleware.js @@ -13,6 +13,10 @@ const isUniqueFor = (context, type) => { export default { Mutation: { + SignupVerification: async (resolve, root, args, context, info) => { + args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'User'))) + return resolve(root, args, context, info) + }, CreatePost: async (resolve, root, args, context, info) => { args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post'))) return resolve(root, args, context, info) @@ -21,10 +25,6 @@ export default { args.slug = args.slug || (await uniqueSlug(args.title, isUniqueFor(context, 'Post'))) return resolve(root, args, context, info) }, - CreateUser: async (resolve, root, args, context, info) => { - args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'User'))) - return resolve(root, args, context, info) - }, CreateOrganization: async (resolve, root, args, context, info) => { args.slug = args.slug || (await uniqueSlug(args.name, isUniqueFor(context, 'Organization'))) return resolve(root, args, context, info) diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js index 4e060dc90..5ee4faa3c 100644 --- a/backend/src/middleware/slugifyMiddleware.spec.js +++ b/backend/src/middleware/slugifyMiddleware.spec.js @@ -1,10 +1,12 @@ import { GraphQLClient } from 'graphql-request' import Factory from '../seed/factories' import { host, login } from '../jest/helpers' +import { neode } from '../bootstrap/neo4j' let authenticatedClient let headers const factory = Factory() +const instance = neode() beforeEach(async () => { const adminParams = { role: 'admin', email: 'admin@example.org', password: '1234' } @@ -76,33 +78,41 @@ describe('slugify', () => { }) }) - describe('CreateUser', () => { - const action = async (mutation, params) => { - return authenticatedClient.request(`mutation { - ${mutation}(password: "yo", email: "123@123.de", ${params}) { slug } - }`) + describe('SignupVerification', () => { + const mutation = `mutation($password: String!, $email: String!, $name: String!, $slug: String, $nonce: String!) { + SignupVerification(email: $email, password: $password, name: $name, slug: $slug, nonce: $nonce) { slug } } + ` + + const action = async variables => { + // required for SignupVerification + await instance.create('EmailAddress', { email: '123@example.org', nonce: '123456' }) + + const defaultVariables = { nonce: '123456', password: 'yo', email: '123@example.org' } + return authenticatedClient.request(mutation, { ...defaultVariables, ...variables }) + } + it('generates a slug based on name', async () => { - await expect(action('CreateUser', 'name: "I am a user"')).resolves.toEqual({ - CreateUser: { slug: 'i-am-a-user' }, + await expect(action({ name: 'I am a user' })).resolves.toEqual({ + SignupVerification: { slug: 'i-am-a-user' }, }) }) describe('if slug exists', () => { beforeEach(async () => { - await action('CreateUser', 'name: "Pre-existing user", slug: "pre-existing-user"') + await factory.create('User', { name: 'pre-existing user', slug: 'pre-existing-user' }) }) it('chooses another slug', async () => { - await expect(action('CreateUser', 'name: "pre-existing-user"')).resolves.toEqual({ - CreateUser: { slug: 'pre-existing-user-1' }, + await expect(action({ name: 'pre-existing-user' })).resolves.toEqual({ + SignupVerification: { slug: 'pre-existing-user-1' }, }) }) describe('but if the client specifies a slug', () => { - it('rejects CreateUser', async () => { + it('rejects SignupVerification', async () => { await expect( - action('CreateUser', 'name: "Pre-existing user", slug: "pre-existing-user"'), + action({ name: 'Pre-existing user', slug: 'pre-existing-user' }), ).rejects.toThrow('already exists') }) }) diff --git a/backend/src/middleware/userMiddleware.js b/backend/src/middleware/userMiddleware.js index 29e512ebd..fafbd44e5 100644 --- a/backend/src/middleware/userMiddleware.js +++ b/backend/src/middleware/userMiddleware.js @@ -2,7 +2,7 @@ import createOrUpdateLocations from './nodes/locations' export default { Mutation: { - CreateUser: async (resolve, root, args, context, info) => { + SignupVerification: async (resolve, root, args, context, info) => { const result = await resolve(root, args, context, info) await createOrUpdateLocations(args.id, args.locationName, context.driver) return result diff --git a/backend/src/middleware/validation/index.js b/backend/src/middleware/validation/index.js index cfc852dcb..ca7a6b338 100644 --- a/backend/src/middleware/validation/index.js +++ b/backend/src/middleware/validation/index.js @@ -1,16 +1,5 @@ import { UserInputError } from 'apollo-server' -const USERNAME_MIN_LENGTH = 3 - -const validateUsername = async (resolve, root, args, context, info) => { - if (!('name' in args) || (args.name && args.name.length >= USERNAME_MIN_LENGTH)) { - /* eslint-disable-next-line no-return-await */ - return await resolve(root, args, context, info) - } else { - throw new UserInputError(`Username must be at least ${USERNAME_MIN_LENGTH} characters long!`) - } -} - const validateUrl = async (resolve, root, args, context, info) => { const { url } = args const isValid = url.match(/^(?:https?:\/\/)(?:[^@\n])?(?:www\.)?([^:/\n?]+)/g) @@ -24,8 +13,6 @@ const validateUrl = async (resolve, root, args, context, info) => { export default { Mutation: { - CreateUser: validateUsername, - UpdateUser: validateUsername, CreateSocialMedia: validateUrl, }, } diff --git a/backend/src/middleware/validation/validationMiddleware.js b/backend/src/middleware/validation/validationMiddleware.js new file mode 100644 index 000000000..9ac15a60f --- /dev/null +++ b/backend/src/middleware/validation/validationMiddleware.js @@ -0,0 +1,22 @@ +import { UserInputError } from 'apollo-server' +import Joi from '@hapi/joi' + +const validate = schema => { + return async (resolve, root, args, context, info) => { + const validation = schema.validate(args) + if (validation.error) throw new UserInputError(validation.error) + return resolve(root, args, context, info) + } +} + +const socialMediaSchema = Joi.object().keys({ + url: Joi.string() + .uri() + .required(), +}) + +export default { + Mutation: { + CreateSocialMedia: validate(socialMediaSchema), + }, +} diff --git a/backend/src/models/EmailAddress.js b/backend/src/models/EmailAddress.js new file mode 100644 index 000000000..ddd56c297 --- /dev/null +++ b/backend/src/models/EmailAddress.js @@ -0,0 +1,12 @@ +module.exports = { + email: { type: 'string', primary: true, lowercase: true, email: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + verifiedAt: { type: 'string', isoDate: true }, + nonce: { type: 'string', token: true }, + belongsTo: { + type: 'relationship', + relationship: 'BELONGS_TO', + target: 'User', + direction: 'out', + }, +} diff --git a/backend/src/models/InvitationCode.js b/backend/src/models/InvitationCode.js new file mode 100644 index 000000000..f137f6c15 --- /dev/null +++ b/backend/src/models/InvitationCode.js @@ -0,0 +1,16 @@ +module.exports = { + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + token: { type: 'string', primary: true, token: true }, + generatedBy: { + type: 'relationship', + relationship: 'GENERATED', + target: 'User', + direction: 'in', + }, + activated: { + type: 'relationship', + relationship: 'ACTIVATED', + target: 'EmailAddress', + direction: 'out', + }, +} diff --git a/backend/src/models/User.js b/backend/src/models/User.js new file mode 100644 index 000000000..d8f768ae9 --- /dev/null +++ b/backend/src/models/User.js @@ -0,0 +1,54 @@ +import uuid from 'uuid/v4' + +module.exports = { + id: { type: 'string', primary: true, default: uuid }, // TODO: should be type: 'uuid' but simplified for our tests + actorId: { type: 'string', allow: [null] }, + name: { type: 'string', min: 3 }, + email: { type: 'string', lowercase: true, email: true }, + slug: 'string', + encryptedPassword: 'string', + avatar: { type: 'string', allow: [null] }, + coverImg: { type: 'string', allow: [null] }, + deleted: { type: 'boolean', default: false }, + disabled: { type: 'boolean', default: false }, + role: { type: 'string', default: 'user' }, + publicKey: 'string', + privateKey: 'string', + wasInvited: 'boolean', + wasSeeded: 'boolean', + locationName: { type: 'string', allow: [null] }, + about: { type: 'string', allow: [null] }, + primaryEmail: { + type: 'relationship', + relationship: 'PRIMARY_EMAIL', + target: 'EmailAddress', + direction: 'out', + }, + following: { + type: 'relationship', + relationship: 'FOLLOWS', + target: 'User', + direction: 'out', + }, + followedBy: { + type: 'relationship', + relationship: 'FOLLOWS', + target: 'User', + direction: 'in', + }, + friends: { type: 'relationship', relationship: 'FRIENDS', target: 'User', direction: 'both' }, + disabledBy: { + type: 'relationship', + relationship: 'DISABLED', + target: 'User', + direction: 'in', + }, + invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, + updatedAt: { + type: 'string', + isoDate: true, + required: true, + default: () => new Date().toISOString(), + }, +} diff --git a/backend/src/models/User.spec.js b/backend/src/models/User.spec.js new file mode 100644 index 000000000..e00136970 --- /dev/null +++ b/backend/src/models/User.spec.js @@ -0,0 +1,20 @@ +import Factory from '../seed/factories' +import { neode } from '../bootstrap/neo4j' + +const factory = Factory() +const instance = neode() + +afterEach(async () => { + await factory.cleanDatabase() +}) + +describe('role', () => { + it('defaults to `user`', async () => { + const user = await instance.create('User', { name: 'John' }) + await expect(user.toJson()).resolves.toEqual( + expect.objectContaining({ + role: 'user', + }), + ) + }) +}) diff --git a/backend/src/models/index.js b/backend/src/models/index.js new file mode 100644 index 000000000..0e6ae5864 --- /dev/null +++ b/backend/src/models/index.js @@ -0,0 +1,7 @@ +// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm +// module that is not browser-compatible. Node's `fs` module is server-side only +export default { + User: require('./User.js'), + InvitationCode: require('./InvitationCode.js'), + EmailAddress: require('./EmailAddress.js'), +} diff --git a/backend/src/schema/index.js b/backend/src/schema/index.js index d294d8aba..8fbb5cfda 100644 --- a/backend/src/schema/index.js +++ b/backend/src/schema/index.js @@ -12,10 +12,12 @@ export default applyScalars( resolvers, config: { query: { - exclude: ['Notfication', 'Statistics', 'LoggedInUser'], + exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'], + // add 'User' here as soon as possible }, mutation: { - exclude: ['Notfication', 'Statistics', 'LoggedInUser'], + exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'], + // add 'User' here as soon as possible }, debug: CONFIG.DEBUG, }, diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js index 07462ed49..7f17539dc 100644 --- a/backend/src/schema/resolvers/comments.spec.js +++ b/backend/src/schema/resolvers/comments.spec.js @@ -9,12 +9,16 @@ let createCommentVariables let createPostVariables let createCommentVariablesSansPostId let createCommentVariablesWithNonExistentPost +let userParams +let authorParams beforeEach(async () => { - await factory.create('User', { + userParams = { + name: 'TestUser', email: 'test@example.org', password: '1234', - }) + } + await factory.create('User', userParams) }) afterEach(async () => { @@ -53,10 +57,7 @@ describe('CreateComment', () => { describe('authenticated', () => { let headers beforeEach(async () => { - headers = await login({ - email: 'test@example.org', - password: '1234', - }) + headers = await login(userParams) client = new GraphQLClient(host, { headers, }) @@ -89,7 +90,7 @@ describe('CreateComment', () => { const { User } = await client.request(gql` { - User(email: "test@example.org") { + User(name: "TestUser") { comments { content } @@ -201,15 +202,13 @@ describe('DeleteComment', () => { } beforeEach(async () => { + authorParams = { + email: 'author@example.org', + password: '1234', + } const asAuthor = Factory() - await asAuthor.create('User', { - email: 'author@example.org', - password: '1234', - }) - await asAuthor.authenticateAs({ - email: 'author@example.org', - password: '1234', - }) + await asAuthor.create('User', authorParams) + await asAuthor.authenticateAs(authorParams) await asAuthor.create('Post', { id: 'p1', content: 'Post to be commented', @@ -233,13 +232,8 @@ describe('DeleteComment', () => { describe('authenticated but not the author', () => { beforeEach(async () => { let headers - headers = await login({ - email: 'test@example.org', - password: '1234', - }) - client = new GraphQLClient(host, { - headers, - }) + headers = await login(userParams) + client = new GraphQLClient(host, { headers }) }) it('throws authorization error', async () => { @@ -252,13 +246,8 @@ describe('DeleteComment', () => { describe('authenticated as author', () => { beforeEach(async () => { let headers - headers = await login({ - email: 'author@example.org', - password: '1234', - }) - client = new GraphQLClient(host, { - headers, - }) + headers = await login(authorParams) + client = new GraphQLClient(host, { headers }) }) it('deletes the comment', async () => { diff --git a/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.js index b1dec603b..db679f522 100644 --- a/backend/src/schema/resolvers/moderation.spec.js +++ b/backend/src/schema/resolvers/moderation.spec.js @@ -254,7 +254,7 @@ describe('enable', () => { beforeEach(async () => { authenticateClient = setupAuthenticateClient({ role: 'moderator', - email: 'someUser@example.org', + email: 'someuser@example.org', password: '1234', }) }) diff --git a/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.js index 13789662b..415eb6f21 100644 --- a/backend/src/schema/resolvers/passwordReset.js +++ b/backend/src/schema/resolvers/passwordReset.js @@ -1,22 +1,5 @@ import uuid from 'uuid/v4' import bcrypt from 'bcryptjs' -import CONFIG from '../../config' -import nodemailer from 'nodemailer' -import { resetPasswordMail, wrongAccountMail } from './passwordReset/emailTemplates' - -const transporter = () => { - const configs = { - host: CONFIG.SMTP_HOST, - port: CONFIG.SMTP_PORT, - ignoreTLS: CONFIG.SMTP_IGNORE_TLS, - secure: false, // true for 465, false for other ports - } - const { SMTP_USERNAME: user, SMTP_PASSWORD: pass } = CONFIG - if (user && pass) { - configs.auth = { user, pass } - } - return nodemailer.createTransport(configs) -} export async function createPasswordReset(options) { const { driver, code, email, issuedAt = new Date() } = options @@ -42,27 +25,28 @@ export default { requestPasswordReset: async (_, { email }, { driver }) => { const code = uuid().substring(0, 6) const [user] = await createPasswordReset({ driver, code, email }) - if (CONFIG.SMTP_HOST && CONFIG.SMTP_PORT) { - const name = (user && user.name) || '' - const mailTemplate = user ? resetPasswordMail : wrongAccountMail - await transporter().sendMail(mailTemplate({ email, code, name })) - } - return true + const name = (user && user.name) || '' + return { user, code, name, response: true } }, resetPassword: async (_, { email, code, newPassword }, { driver }) => { const session = driver.session() const stillValid = new Date() stillValid.setDate(stillValid.getDate() - 1) - const newHashedPassword = await bcrypt.hashSync(newPassword, 10) + const encryptedNewPassword = await bcrypt.hashSync(newPassword, 10) const cypher = ` MATCH (pr:PasswordReset {code: $code}) MATCH (u:User {email: $email})-[:REQUESTED]->(pr) WHERE duration.between(pr.issuedAt, datetime()).days <= 0 AND pr.usedAt IS NULL SET pr.usedAt = datetime() - SET u.password = $newHashedPassword + SET u.encryptedPassword = $encryptedNewPassword RETURN pr ` - let transactionRes = await session.run(cypher, { stillValid, email, code, newHashedPassword }) + let transactionRes = await session.run(cypher, { + stillValid, + email, + code, + encryptedNewPassword, + }) const [reset] = transactionRes.records.map(record => record.get('pr')) const result = !!(reset && reset.properties.usedAt) session.close() diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index 763945527..2e5069de7 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -4,6 +4,9 @@ import { host, login } from '../../jest/helpers' const factory = Factory() let client +let userParams +let authorParams + const postTitle = 'I am a title' const postContent = 'Some content' const oldTitle = 'Old title' @@ -33,10 +36,16 @@ const postQueryWithCategories = ` } ` beforeEach(async () => { - await factory.create('User', { + userParams = { + name: 'TestUser', email: 'test@example.org', password: '1234', - }) + } + authorParams = { + email: 'author@example.org', + password: '1234', + } + await factory.create('User', userParams) }) afterEach(async () => { @@ -66,7 +75,7 @@ describe('CreatePost', () => { describe('authenticated', () => { let headers beforeEach(async () => { - headers = await login({ email: 'test@example.org', password: '1234' }) + headers = await login(userParams) client = new GraphQLClient(host, { headers }) }) @@ -84,7 +93,7 @@ describe('CreatePost', () => { await client.request(mutation, createPostVariables) const { User } = await client.request( `{ - User(email:"test@example.org") { + User(name: "TestUser") { contributions { title } @@ -163,14 +172,8 @@ describe('UpdatePost', () => { let updatePostVariables beforeEach(async () => { const asAuthor = Factory() - await asAuthor.create('User', { - email: 'author@example.org', - password: '1234', - }) - await asAuthor.authenticateAs({ - email: 'author@example.org', - password: '1234', - }) + await asAuthor.create('User', authorParams) + await asAuthor.authenticateAs(authorParams) await asAuthor.create('Post', { id: 'p1', title: oldTitle, @@ -205,7 +208,7 @@ describe('UpdatePost', () => { describe('authenticated but not the author', () => { let headers beforeEach(async () => { - headers = await login({ email: 'test@example.org', password: '1234' }) + headers = await login(userParams) client = new GraphQLClient(host, { headers }) }) @@ -219,7 +222,7 @@ describe('UpdatePost', () => { describe('authenticated as author', () => { let headers beforeEach(async () => { - headers = await login({ email: 'author@example.org', password: '1234' }) + headers = await login(authorParams) client = new GraphQLClient(host, { headers }) }) @@ -297,14 +300,8 @@ describe('DeletePost', () => { beforeEach(async () => { const asAuthor = Factory() - await asAuthor.create('User', { - email: 'author@example.org', - password: '1234', - }) - await asAuthor.authenticateAs({ - email: 'author@example.org', - password: '1234', - }) + await asAuthor.create('User', authorParams) + await asAuthor.authenticateAs(authorParams) await asAuthor.create('Post', { id: 'p1', content: 'To be deleted', @@ -321,7 +318,7 @@ describe('DeletePost', () => { describe('authenticated but not the author', () => { let headers beforeEach(async () => { - headers = await login({ email: 'test@example.org', password: '1234' }) + headers = await login(userParams) client = new GraphQLClient(host, { headers }) }) @@ -333,7 +330,7 @@ describe('DeletePost', () => { describe('authenticated as author', () => { let headers beforeEach(async () => { - headers = await login({ email: 'author@example.org', password: '1234' }) + headers = await login(authorParams) client = new GraphQLClient(host, { headers }) }) diff --git a/backend/src/schema/resolvers/registration.js b/backend/src/schema/resolvers/registration.js new file mode 100644 index 000000000..3c8243d8a --- /dev/null +++ b/backend/src/schema/resolvers/registration.js @@ -0,0 +1,107 @@ +import { UserInputError } from 'apollo-server' +import uuid from 'uuid/v4' +import { neode } from '../../bootstrap/neo4j' +import fileUpload from './fileUpload' +import encryptPassword from '../../helpers/encryptPassword' + +const instance = neode() + +/* + * TODO: remove this function as soon type `User` has no `email` property + * anymore + */ +const checkEmailDoesNotExist = async ({ email }) => { + email = email.toLowerCase() + const users = await instance.all('User', { email }) + if (users.length > 0) throw new UserInputError('User account with this email already exists.') +} + +export default { + Mutation: { + CreateInvitationCode: async (parent, args, context, resolveInfo) => { + args.token = uuid().substring(0, 6) + const { + user: { id: userId }, + } = context + let response + try { + const [user, invitationCode] = await Promise.all([ + instance.find('User', userId), + instance.create('InvitationCode', args), + ]) + await invitationCode.relateTo(user, 'generatedBy') + response = invitationCode.toJson() + response.generatedBy = user.toJson() + } catch (e) { + throw new UserInputError(e) + } + return response + }, + Signup: async (parent, args, context, resolveInfo) => { + const nonce = uuid().substring(0, 6) + args.nonce = nonce + await checkEmailDoesNotExist({ email: args.email }) + try { + const emailAddress = await instance.create('EmailAddress', args) + return { response: emailAddress.toJson(), nonce } + } catch (e) { + throw new UserInputError(e.message) + } + }, + SignupByInvitation: async (parent, args, context, resolveInfo) => { + const { token } = args + const nonce = uuid().substring(0, 6) + args.nonce = nonce + await checkEmailDoesNotExist({ email: args.email }) + try { + const result = await instance.cypher( + ` + MATCH (invitationCode:InvitationCode {token:{token}}) + WHERE NOT (invitationCode)-[:ACTIVATED]->() + RETURN invitationCode + `, + { token }, + ) + const validInvitationCode = instance.hydrateFirst( + result, + 'invitationCode', + instance.model('InvitationCode'), + ) + if (!validInvitationCode) + throw new UserInputError('Invitation code already used or does not exist.') + const emailAddress = await instance.create('EmailAddress', args) + await validInvitationCode.relateTo(emailAddress, 'activated') + return { response: emailAddress.toJson(), nonce } + } catch (e) { + throw new UserInputError(e) + } + }, + SignupVerification: async (object, args, context, resolveInfo) => { + let { nonce, email } = args + email = email.toLowerCase() + const result = await instance.cypher( + ` + MATCH(email:EmailAddress {nonce: {nonce}, email: {email}}) + WHERE NOT (email)-[:BELONGS_TO]->() + RETURN email + `, + { nonce, email }, + ) + const emailAddress = await instance.hydrateFirst(result, 'email', instance.model('Email')) + if (!emailAddress) throw new UserInputError('Invalid email or nonce') + args = await fileUpload(args, { file: 'avatarUpload', url: 'avatar' }) + args = await encryptPassword(args) + try { + const user = await instance.create('User', args) + await Promise.all([ + user.relateTo(emailAddress, 'primaryEmail'), + emailAddress.relateTo(user, 'belongsTo'), + emailAddress.update({ verifiedAt: new Date().toISOString() }), + ]) + return user.toJson() + } catch (e) { + throw new UserInputError(e.message) + } + }, + }, +} diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js new file mode 100644 index 000000000..2cbce9a36 --- /dev/null +++ b/backend/src/schema/resolvers/registration.spec.js @@ -0,0 +1,402 @@ +import { GraphQLClient } from 'graphql-request' +import Factory from '../../seed/factories' +import { host, login } from '../../jest/helpers' +import { neode } from '../../bootstrap/neo4j' + +let factory +let client +let variables +let action +let userParams +const instance = neode() + +beforeEach(async () => { + variables = {} + factory = Factory() +}) + +afterEach(async () => { + await factory.cleanDatabase() +}) + +describe('CreateInvitationCode', () => { + const mutation = `mutation { CreateInvitationCode { token } }` + + it('throws Authorization error', async () => { + const client = new GraphQLClient(host) + await expect(client.request(mutation)).rejects.toThrow('Not Authorised!') + }) + + describe('authenticated', () => { + beforeEach(async () => { + userParams = { + id: 'i123', + name: 'Inviter', + email: 'inviter@example.org', + password: '1234', + } + action = async () => { + const factory = Factory() + await factory.create('User', userParams) + const headers = await login(userParams) + client = new GraphQLClient(host, { headers }) + return client.request(mutation) + } + }) + + it('resolves', async () => { + await expect(action()).resolves.toEqual({ + CreateInvitationCode: { token: expect.any(String) }, + }) + }) + + it('creates an InvitationCode with a `createdAt` attribute', async () => { + await action() + const codes = await instance.all('InvitationCode') + const invitation = await codes.first().toJson() + expect(invitation.createdAt).toBeTruthy() + expect(Date.parse(invitation.createdAt)).toEqual(expect.any(Number)) + }) + + it('relates inviting User to InvitationCode', async () => { + await action() + const result = await instance.cypher( + 'MATCH(code:InvitationCode)<-[:GENERATED]-(user:User) RETURN user', + ) + const inviter = instance.hydrateFirst(result, 'user', instance.model('User')) + await expect(inviter.toJson()).resolves.toEqual(expect.objectContaining({ name: 'Inviter' })) + }) + + describe('who has invited a lot of users already', () => { + beforeEach(() => { + action = async () => { + const factory = Factory() + await factory.create('User', userParams) + const headers = await login(userParams) + client = new GraphQLClient(host, { headers }) + await Promise.all( + [1, 2, 3].map(() => { + return client.request(mutation) + }), + ) + return client.request(mutation, variables) + } + }) + + describe('as ordinary `user`', () => { + it('throws `Not Authorised` because of maximum number of invitations', async () => { + await expect(action()).rejects.toThrow('Not Authorised') + }) + + it('creates no additional invitation codes', async done => { + try { + await action() + } catch (e) { + const invitationCodes = await instance.all('InvitationCode') + await expect(invitationCodes.toJson()).resolves.toHaveLength(3) + done() + } + }) + }) + + describe('as a strong donator', () => { + beforeEach(() => { + // What is the setup? + }) + + it.todo('can invite more people') + // it('can invite more people', async () => { + // await action() + // const invitationQuery = `{ User { createdAt } }` + // const { User: users } = await client.request(invitationQuery ) + // expect(users).toHaveLength(3 + 1 + 1) + // }) + }) + }) + }) +}) + +describe('SignupByInvitation', () => { + const mutation = `mutation($email: String!, $token: String!) { + SignupByInvitation(email: $email, token: $token) { email } + }` + + beforeEach(() => { + client = new GraphQLClient(host) + action = async () => { + return client.request(mutation, variables) + } + }) + + describe('with valid email but invalid InvitationCode', () => { + beforeEach(() => { + variables.email = 'any-email@example.org' + variables.token = 'wut?' + }) + + it('throws UserInputError', async () => { + await expect(action()).rejects.toThrow('Invitation code already used or does not exist.') + }) + }) + + describe('with valid InvitationCode', () => { + beforeEach(async () => { + const inviterParams = { + name: 'Inviter', + email: 'inviter@example.org', + password: '1234', + } + const factory = Factory() + await factory.create('User', inviterParams) + const headersOfInviter = await login(inviterParams) + const anotherClient = new GraphQLClient(host, { headers: headersOfInviter }) + const invitationMutation = `mutation { CreateInvitationCode { token } }` + const { + CreateInvitationCode: { token }, + } = await anotherClient.request(invitationMutation) + variables.token = token + }) + + describe('given an invalid email', () => { + beforeEach(() => { + variables.email = 'someuser' + }) + + it('throws `email is not a valid email`', async () => { + await expect(action()).rejects.toThrow('"email" must be a valid email') + }) + + it('creates no EmailAddress node', async done => { + try { + await action() + } catch (e) { + const emailAddresses = await instance.all('EmailAddress') + expect(emailAddresses).toHaveLength(0) + done() + } + }) + }) + + describe('given a valid email', () => { + beforeEach(() => { + variables.email = 'someUser@example.org' + }) + + it('resolves', async () => { + await expect(action()).resolves.toEqual({ + SignupByInvitation: { email: 'someuser@example.org' }, + }) + }) + + describe('creates a EmailAddress node', () => { + it('with a `createdAt` attribute', async () => { + await action() + const emailAddresses = await instance.all('EmailAddress') + const emailAddress = await emailAddresses.first().toJson() + expect(emailAddress.createdAt).toBeTruthy() + expect(Date.parse(emailAddress.createdAt)).toEqual(expect.any(Number)) + }) + + it('with a cryptographic `nonce`', async () => { + await action() + const emailAddresses = await instance.all('EmailAddress') + const emailAddress = await emailAddresses.first().toJson() + expect(emailAddress.nonce).toEqual(expect.any(String)) + }) + + it('connects inviter through invitation code', async () => { + await action() + const result = await instance.cypher( + 'MATCH(inviter:User)-[:GENERATED]->(:InvitationCode)-[:ACTIVATED]->(email:EmailAddress {email: {email}}) RETURN inviter', + { email: 'someuser@example.org' }, + ) + const inviter = instance.hydrateFirst(result, 'inviter', instance.model('User')) + await expect(inviter.toJson()).resolves.toEqual( + expect.objectContaining({ name: 'Inviter' }), + ) + }) + + describe('using the same InvitationCode twice', () => { + it('rejects because codes can be used only once', async done => { + await action() + try { + await action() + } catch (e) { + expect(e.message).toMatch(/Invitation code already used/) + done() + } + }) + }) + + describe('if a user account with the given email already exists', () => { + beforeEach(async () => { + await factory.create('User', { email: 'someuser@example.org' }) + }) + + it('throws unique violation error', async () => { + await expect(action()).rejects.toThrow('User account with this email already exists.') + }) + }) + + describe('if the EmailAddress already exists but without user account', () => { + // shall we re-send the registration email? + it.todo('decide what to do') + }) + }) + }) + }) +}) + +describe('Signup', () => { + const mutation = `mutation($email: String!) { + Signup(email: $email) { email } + }` + + it('throws AuthorizationError', async () => { + client = new GraphQLClient(host) + await expect( + client.request(mutation, { email: 'get-me-a-user-account@example.org' }), + ).rejects.toThrow('Not Authorised') + }) + + describe('as admin', () => { + beforeEach(async () => { + userParams = { + role: 'admin', + email: 'admin@example.org', + password: '1234', + } + variables.email = 'someuser@example.org' + const factory = Factory() + await factory.create('User', userParams) + const headers = await login(userParams) + client = new GraphQLClient(host, { headers }) + action = async () => { + return client.request(mutation, variables) + } + }) + + it('is allowed to signup users by email', async () => { + await expect(action()).resolves.toEqual({ Signup: { email: 'someuser@example.org' } }) + }) + + it('creates a Signup with a cryptographic `nonce`', async () => { + await action() + const emailAddresses = await instance.all('EmailAddress') + const emailAddress = await emailAddresses.first().toJson() + expect(emailAddress.nonce).toEqual(expect.any(String)) + }) + }) +}) + +describe('SignupVerification', () => { + const mutation = ` + mutation($name: String!, $password: String!, $email: String!, $nonce: String!) { + SignupVerification(name: $name, password: $password, email: $email, nonce: $nonce) { + id + } + } + ` + describe('given valid password and email', () => { + let variables = { + nonce: '123456', + name: 'John Doe', + password: '123', + email: 'john@example.org', + } + + describe('unauthenticated', () => { + beforeEach(async () => { + client = new GraphQLClient(host) + }) + + describe('EmailAddress exists, but is already related to a user account', () => { + beforeEach(async () => { + const { email, nonce } = variables + const [emailAddress, user] = await Promise.all([ + instance.model('EmailAddress').create({ email, nonce }), + instance + .model('User') + .create({ name: 'Somebody', password: '1234', email: 'john@example.org' }), + ]) + await emailAddress.relateTo(user, 'belongsTo') + }) + + describe('sending a valid nonce', () => { + beforeEach(() => { + variables.nonce = '123456' + }) + + it('rejects', async () => { + await expect(client.request(mutation, variables)).rejects.toThrow( + 'Invalid email or nonce', + ) + }) + }) + }) + + describe('disconnected EmailAddress exists', () => { + beforeEach(async () => { + const args = { + email: 'john@example.org', + nonce: '123456', + } + await instance.model('EmailAddress').create(args) + }) + + describe('sending a valid nonce', () => { + it('creates a user account', async () => { + const expected = { + SignupVerification: { + id: expect.any(String), + }, + } + await expect(client.request(mutation, variables)).resolves.toEqual(expected) + }) + + it('sets `verifiedAt` attribute of EmailAddress', async () => { + await client.request(mutation, variables) + const email = await instance.first('EmailAddress', { email: 'john@example.org' }) + await expect(email.toJson()).resolves.toEqual( + expect.objectContaining({ + verifiedAt: expect.any(String), + }), + ) + }) + + it('connects User with EmailAddress', async () => { + const cypher = ` + MATCH(email:EmailAddress)-[:BELONGS_TO]->(u:User {name: {name}}) + RETURN email + ` + await client.request(mutation, variables) + const { records: emails } = await instance.cypher(cypher, { name: 'John Doe' }) + expect(emails).toHaveLength(1) + }) + + it('marks the EmailAddress as primary', async () => { + const cypher = ` + MATCH(email:EmailAddress)<-[:PRIMARY_EMAIL]-(u:User {name: {name}}) + RETURN email + ` + await client.request(mutation, variables) + const { records: emails } = await instance.cypher(cypher, { name: 'John Doe' }) + expect(emails).toHaveLength(1) + }) + }) + + describe('sending invalid nonce', () => { + beforeEach(() => { + variables.nonce = 'wut2' + }) + + it('rejects', async () => { + await expect(client.request(mutation, variables)).rejects.toThrow( + 'Invalid email or nonce', + ) + }) + }) + }) + }) + }) +}) diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js index 38850761c..bacc86fbe 100644 --- a/backend/src/schema/resolvers/socialMedia.spec.js +++ b/backend/src/schema/resolvers/socialMedia.spec.js @@ -98,14 +98,19 @@ describe('SocialMedia', () => { const variables = { url: '', } - await expect(client.request(mutationC, variables)).rejects.toThrow('Input is not a URL') + await expect(client.request(mutationC, variables)).rejects.toThrow( + '"url" is not allowed to be empty', + ) }) it('validates URLs', async () => { const variables = { url: 'not-a-url', } - await expect(client.request(mutationC, variables)).rejects.toThrow('Input is not a URL') + + await expect(client.request(mutationC, variables)).rejects.toThrow( + '"url" must be a valid uri', + ) }) }) }) diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js index e33314f7e..b62f9a609 100644 --- a/backend/src/schema/resolvers/user_management.js +++ b/backend/src/schema/resolvers/user_management.js @@ -5,7 +5,7 @@ import { neo4jgraphql } from 'neo4j-graphql-js' export default { Query: { - isLoggedIn: (parent, args, { driver, user }) => { + isLoggedIn: (_, args, { driver, user }) => { return Boolean(user && user.id) }, currentUser: async (object, params, ctx, resolveInfo) => { @@ -15,40 +15,29 @@ export default { }, }, Mutation: { - signup: async (parent, { email, password }, { req }) => { - // if (data[email]) { - // throw new Error('Another User with same email exists.') - // } - // data[email] = { - // password: await bcrypt.hashSync(password, 10), - // } - - return true - }, - login: async (parent, { email, password }, { driver, req, user }) => { + login: async (_, { email, password }, { driver, req, user }) => { // if (user && user.id) { // throw new Error('Already logged in.') // } const session = driver.session() const result = await session.run( 'MATCH (user:User {email: $userEmail}) ' + - 'RETURN user {.id, .slug, .name, .avatar, .email, .password, .role, .disabled} as user LIMIT 1', + 'RETURN user {.id, .slug, .name, .avatar, .email, .encryptedPassword, .role, .disabled} as user LIMIT 1', { userEmail: email, }, ) - session.close() - const [currentUser] = await result.records.map(function(record) { + const [currentUser] = await result.records.map(record => { return record.get('user') }) if ( currentUser && - (await bcrypt.compareSync(password, currentUser.password)) && + (await bcrypt.compareSync(password, currentUser.encryptedPassword)) && !currentUser.disabled ) { - delete currentUser.password + delete currentUser.encryptedPassword return encode(currentUser) } else if (currentUser && currentUser.disabled) { throw new AuthenticationError('Your account has been disabled.') @@ -60,7 +49,7 @@ export default { const session = driver.session() let result = await session.run( `MATCH (user:User {email: $userEmail}) - RETURN user {.id, .email, .password}`, + RETURN user {.id, .email, .encryptedPassword}`, { userEmail: user.email, }, @@ -70,22 +59,22 @@ export default { return record.get('user') }) - if (!(await bcrypt.compareSync(oldPassword, currentUser.password))) { + if (!(await bcrypt.compareSync(oldPassword, currentUser.encryptedPassword))) { throw new AuthenticationError('Old password is not correct') } - if (await bcrypt.compareSync(newPassword, currentUser.password)) { + if (await bcrypt.compareSync(newPassword, currentUser.encryptedPassword)) { throw new AuthenticationError('Old password and new password should be different') } else { - const newHashedPassword = await bcrypt.hashSync(newPassword, 10) + const newEncryptedPassword = await bcrypt.hashSync(newPassword, 10) session.run( `MATCH (user:User {email: $userEmail}) - SET user.password = $newHashedPassword + SET user.encryptedPassword = $newEncryptedPassword RETURN user `, { userEmail: user.email, - newHashedPassword, + newEncryptedPassword, }, ) session.close() diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js index 463c5ea6d..50b5896b3 100644 --- a/backend/src/schema/resolvers/user_management.spec.js +++ b/backend/src/schema/resolvers/user_management.spec.js @@ -1,4 +1,3 @@ -import gql from 'graphql-tag' import { GraphQLClient, request } from 'graphql-request' import jwt from 'jsonwebtoken' import CONFIG from './../../config' @@ -311,121 +310,3 @@ describe('change password', () => { }) }) }) - -describe('do not expose private RSA key', () => { - let headers - let client - let authenticatedClient - - const queryUserPuplicKey = gql` - query($queriedUserSlug: String) { - User(slug: $queriedUserSlug) { - id - publicKey - } - } - ` - const queryUserPrivateKey = gql` - query($queriedUserSlug: String) { - User(slug: $queriedUserSlug) { - id - privateKey - } - } - ` - - const generateUserWithKeys = async authenticatedClient => { - // Generate user with "privateKey" via 'CreateUser' mutation instead of using the factories "factory.create('User', {...})", see above. - const variables = { - id: 'bcb2d923-f3af-479e-9f00-61b12e864667', - password: 'xYz', - slug: 'apfel-strudel', - name: 'Apfel Strudel', - email: 'apfel-strudel@test.org', - } - await authenticatedClient.request( - gql` - mutation($id: ID, $password: String!, $slug: String, $name: String, $email: String!) { - CreateUser(id: $id, password: $password, slug: $slug, name: $name, email: $email) { - id - } - } - `, - variables, - ) - } - - beforeEach(async () => { - const adminParams = { - role: 'admin', - email: 'admin@example.org', - password: '1234', - } - // create an admin user who has enough permissions to create other users - await factory.create('User', adminParams) - const headers = await login(adminParams) - authenticatedClient = new GraphQLClient(host, { headers }) - // but also create an unauthenticated client to issue the `User` query - client = new GraphQLClient(host) - }) - - describe('unauthenticated query of "publicKey" (does the RSA key pair get generated at all?)', () => { - it('returns publicKey', async () => { - await generateUserWithKeys(authenticatedClient) - await expect( - await client.request(queryUserPuplicKey, { queriedUserSlug: 'apfel-strudel' }), - ).toEqual( - expect.objectContaining({ - User: [ - { - id: 'bcb2d923-f3af-479e-9f00-61b12e864667', - publicKey: expect.any(String), - }, - ], - }), - ) - }) - }) - - describe('unauthenticated query of "privateKey"', () => { - it('throws "Not Authorised!"', async () => { - await generateUserWithKeys(authenticatedClient) - await expect( - client.request(queryUserPrivateKey, { queriedUserSlug: 'apfel-strudel' }), - ).rejects.toThrow('Not Authorised') - }) - }) - - // authenticate - beforeEach(async () => { - headers = await login({ email: 'test@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - - describe('authenticated query of "publicKey"', () => { - it('returns publicKey', async () => { - await generateUserWithKeys(authenticatedClient) - await expect( - await client.request(queryUserPuplicKey, { queriedUserSlug: 'apfel-strudel' }), - ).toEqual( - expect.objectContaining({ - User: [ - { - id: 'bcb2d923-f3af-479e-9f00-61b12e864667', - publicKey: expect.any(String), - }, - ], - }), - ) - }) - }) - - describe('authenticated query of "privateKey"', () => { - it('throws "Not Authorised!"', async () => { - await generateUserWithKeys(authenticatedClient) - await expect( - client.request(queryUserPrivateKey, { queriedUserSlug: 'apfel-strudel' }), - ).rejects.toThrow('Not Authorised') - }) - }) -}) diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index c5c3701b5..2d9282b60 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -1,15 +1,84 @@ import { neo4jgraphql } from 'neo4j-graphql-js' import fileUpload from './fileUpload' +import { neode } from '../../bootstrap/neo4j' +import { UserInputError } from 'apollo-server' + +const instance = neode() + +const _has = (resolvers, { key, connection }, { returnType }) => { + return async (parent, params, context, resolveInfo) => { + if (typeof parent[key] !== 'undefined') return parent[key] + const { id } = parent + const statement = `MATCH(u:User {id: {id}})${connection} RETURN related` + const result = await instance.cypher(statement, { id }) + let response = result.records.map(r => r.get('related').properties) + if (returnType === 'object') response = response[0] || null + return response + } +} + +const count = obj => { + const resolvers = {} + for (const [key, connection] of Object.entries(obj)) { + resolvers[key] = async (parent, params, context, resolveInfo) => { + if (typeof parent[key] !== 'undefined') return parent[key] + const { id } = parent + const statement = ` + MATCH(u:User {id: {id}})${connection} + WHERE NOT related.deleted = true AND NOT related.disabled = true + RETURN COUNT(DISTINCT(related)) as count + ` + const result = await instance.cypher(statement, { id }) + const [response] = result.records.map(r => r.get('count').toNumber()) + return response + } + } + return resolvers +} + +const undefinedToNull = list => { + const resolvers = {} + list.forEach(key => { + resolvers[key] = async (parent, params, context, resolveInfo) => { + return typeof parent[key] === 'undefined' ? null : parent[key] + } + }) + return resolvers +} + +export const hasMany = obj => { + const resolvers = {} + for (const [key, connection] of Object.entries(obj)) { + resolvers[key] = _has(resolvers, { key, connection }, { returnType: 'iterable' }) + } + return resolvers +} + +export const hasOne = obj => { + const resolvers = {} + for (const [key, connection] of Object.entries(obj)) { + resolvers[key] = _has(resolvers, { key, connection }, { returnType: 'object' }) + } + return resolvers +} export default { - Mutation: { - UpdateUser: async (object, params, context, resolveInfo) => { - params = await fileUpload(params, { file: 'avatarUpload', url: 'avatar' }) - return neo4jgraphql(object, params, context, resolveInfo, false) + Query: { + User: async (object, args, context, resolveInfo) => { + return neo4jgraphql(object, args, context, resolveInfo, false) }, - CreateUser: async (object, params, context, resolveInfo) => { - params = await fileUpload(params, { file: 'avatarUpload', url: 'avatar' }) - return neo4jgraphql(object, params, context, resolveInfo, false) + }, + Mutation: { + UpdateUser: async (object, args, context, resolveInfo) => { + args = await fileUpload(args, { file: 'avatarUpload', url: 'avatar' }) + try { + let user = await instance.find('User', args.id) + if (!user) return null + await user.update(args) + return user.toJson() + } catch (e) { + throw new UserInputError(e.message) + } }, DeleteUser: async (object, params, context, resolveInfo) => { const { resource } = params @@ -34,4 +103,43 @@ export default { return neo4jgraphql(object, params, context, resolveInfo, false) }, }, + User: { + ...undefinedToNull([ + 'actorId', + 'avatar', + 'coverImg', + 'deleted', + 'disabled', + 'locationName', + 'about', + ]), + ...count({ + contributionsCount: '-[:WROTE]->(related:Post)', + friendsCount: '<-[:FRIENDS]->(related:User)', + followingCount: '-[:FOLLOWS]->(related:User)', + followedByCount: '<-[:FOLLOWS]-(related:User)', + commentsCount: '-[:WROTE]->(r:Comment)', + commentedCount: '-[:WROTE]->(:Comment)-[:COMMENTS]->(related:Post)', + shoutedCount: '-[:SHOUTED]->(related:Post)', + badgesCount: '<-[:REWARDED]-(related:Badge)', + }), + ...hasOne({ + invitedBy: '<-[:INVITED]-(related:User)', + disabledBy: '<-[:DISABLED]-(related:User)', + }), + ...hasMany({ + followedBy: '<-[:FOLLOWS]-(related:User)', + following: '-[:FOLLOWS]->(related:User)', + friends: '-[:FRIENDS]-(related:User)', + blacklisted: '-[:BLACKLISTED]->(related:User)', + socialMedia: '-[:OWNED]->(related:SocialMedia)', + contributions: '-[:WROTE]->(related:Post)', + comments: '-[:WROTE]->(related:Comment)', + shouted: '-[:SHOUTED]->(related:Post)', + organizationsCreated: '-[:CREATED_ORGA]->(related:Organization)', + organizationsOwned: '-[:OWNING_ORGA]->(related:Organization)', + categories: '-[:CATEGORIZED]->(related:Category)', + badges: '-[:REWARDED]->(related:Badge)', + }), + }, } diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index 9df5473bf..6f9b6dd3d 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -11,50 +11,39 @@ afterEach(async () => { }) describe('users', () => { - describe('CreateUser', () => { - const mutation = ` - mutation($name: String, $password: String!, $email: String!) { - CreateUser(name: $name, password: $password, email: $email) { - id - } - } - ` - describe('given valid password and email', () => { - const variables = { - name: 'John Doe', - password: '123', - email: '123@123.de', - } - - describe('unauthenticated', () => { - beforeEach(async () => { - client = new GraphQLClient(host) - }) - - it('is not allowed to create users', async () => { - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) + describe('User', () => { + describe('query by email address', () => { + beforeEach(async () => { + await factory.create('User', { name: 'Johnny', email: 'any-email-address@example.org' }) }) - describe('authenticated admin', () => { + const query = `query($email: String) { User(email: $email) { name } }` + const variables = { email: 'any-email-address@example.org' } + beforeEach(() => { + client = new GraphQLClient(host) + }) + + it('is forbidden', async () => { + await expect(client.request(query, variables)).rejects.toThrow('Not Authorised') + }) + + describe('as admin', () => { beforeEach(async () => { - const adminParams = { + const userParams = { role: 'admin', email: 'admin@example.org', password: '1234', } - await factory.create('User', adminParams) - const headers = await login(adminParams) + const factory = Factory() + await factory.create('User', userParams) + const headers = await login(userParams) client = new GraphQLClient(host, { headers }) }) - it('is allowed to create new users', async () => { - const expected = { - CreateUser: { - id: expect.any(String), - }, - } - await expect(client.request(mutation, variables)).resolves.toEqual(expected) + it('is permitted', async () => { + await expect(client.request(query, variables)).resolves.toEqual({ + User: [{ name: 'Johnny' }], + }) }) }) }) @@ -88,7 +77,7 @@ describe('users', () => { describe('as another user', () => { beforeEach(async () => { const someoneElseParams = { - email: 'someoneElse@example.org', + email: 'someone-else@example.org', password: '1234', name: 'James Doe', } @@ -119,12 +108,12 @@ describe('users', () => { await expect(client.request(mutation, variables)).resolves.toEqual(expected) }) - it('with no name', async () => { + it('with `null` as name', async () => { const variables = { id: 'u47', name: null, } - const expected = 'Username must be at least 3 characters long!' + const expected = '"name" must be a string' await expect(client.request(mutation, variables)).rejects.toThrow(expected) }) @@ -133,7 +122,7 @@ describe('users', () => { id: 'u47', name: ' ', } - const expected = 'Username must be at least 3 characters long!' + const expected = '"name" length must be at least 3 characters long' await expect(client.request(mutation, variables)).rejects.toThrow(expected) }) }) @@ -164,7 +153,7 @@ describe('users', () => { id: 'u343', }) await factory.create('User', { - email: 'friendsAccount@example.org', + email: 'friends-account@example.org', password: '1234', id: 'u565', }) diff --git a/backend/src/schema/types/schema.gql b/backend/src/schema/types/schema.gql index cbbadeb52..261501600 100644 --- a/backend/src/schema/types/schema.gql +++ b/backend/src/schema/types/schema.gql @@ -22,7 +22,6 @@ type Query { type Mutation { # Get a JWT Token for the given Email and password login(email: String!, password: String!): String! - signup(email: String!, password: String!): Boolean! changePassword(oldPassword: String!, newPassword: String!): String! requestPasswordReset(email: String!): Boolean! resetPassword(email: String!, code: String!, newPassword: String!): Boolean! @@ -39,7 +38,6 @@ type Mutation { follow(id: ID!, type: FollowTypeEnum): Boolean! # Unfollow the given Type and ID unfollow(id: ID!, type: FollowTypeEnum): Boolean! - DeleteUser(id: ID!, resource: [Deletable]): User } type Statistics { diff --git a/backend/src/schema/types/type/EmailAddress.gql b/backend/src/schema/types/type/EmailAddress.gql new file mode 100644 index 000000000..63b39d457 --- /dev/null +++ b/backend/src/schema/types/type/EmailAddress.gql @@ -0,0 +1,23 @@ +type EmailAddress { + id: ID! + email: String! + verifiedAt: String + createdAt: String +} + +type Mutation { + Signup(email: String!): EmailAddress + SignupByInvitation(email: String!, token: String!): EmailAddress + SignupVerification( + nonce: String! + name: String! + email: String! + password: String! + slug: String + avatar: String + coverImg: String + avatarUpload: Upload + locationName: String + about: String + ): User +} diff --git a/backend/src/schema/types/type/InvitationCode.gql b/backend/src/schema/types/type/InvitationCode.gql new file mode 100644 index 000000000..044967286 --- /dev/null +++ b/backend/src/schema/types/type/InvitationCode.gql @@ -0,0 +1,13 @@ +type InvitationCode { + id: ID! + token: String + generatedBy: User @relation(name: "GENERATED", direction: "IN") + + #createdAt: DateTime + #usedAt: DateTime + createdAt: String +} + +type Mutation { + CreateInvitationCode: InvitationCode +} diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index 6836f16fe..b984f2d79 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -3,20 +3,16 @@ type User { actorId: String name: String email: String! - slug: String - password: String! + slug: String! avatar: String coverImg: String - avatarUpload: Upload deleted: Boolean disabled: Boolean disabledBy: User @relation(name: "DISABLED", direction: "IN") - role: UserGroup + role: UserGroup! publicKey: String - privateKey: String - - wasInvited: Boolean - wasSeeded: Boolean + invitedBy: User @relation(name: "INVITED", direction: "IN") + invited: [User] @relation(name: "INVITED", direction: "OUT") location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") locationName: String @@ -78,3 +74,89 @@ type User { badges: [Badge]! @relation(name: "REWARDED", direction: "IN") badgesCount: Int! @cypher(statement: "MATCH (this)<-[:REWARDED]-(r:Badge) RETURN COUNT(r)") } + + +input _UserFilter { + AND: [_UserFilter!] + OR: [_UserFilter!] + id: ID + id_not: ID + id_in: [ID!] + id_not_in: [ID!] + id_contains: ID + id_not_contains: ID + id_starts_with: ID + id_not_starts_with: ID + id_ends_with: ID + id_not_ends_with: ID + friends: _UserFilter + friends_not: _UserFilter + friends_in: [_UserFilter!] + friends_not_in: [_UserFilter!] + friends_some: _UserFilter + friends_none: _UserFilter + friends_single: _UserFilter + friends_every: _UserFilter + following: _UserFilter + following_not: _UserFilter + following_in: [_UserFilter!] + following_not_in: [_UserFilter!] + following_some: _UserFilter + following_none: _UserFilter + following_single: _UserFilter + following_every: _UserFilter + followedBy: _UserFilter + followedBy_not: _UserFilter + followedBy_in: [_UserFilter!] + followedBy_not_in: [_UserFilter!] + followedBy_some: _UserFilter + followedBy_none: _UserFilter + followedBy_single: _UserFilter + followedBy_every: _UserFilter +} + +type Query { + User( + id: ID + email: String + actorId: String + name: String + slug: String + avatar: String + coverImg: String + role: UserGroup + locationName: String + about: String + createdAt: String + updatedAt: String + friendsCount: Int + followingCount: Int + followedByCount: Int + followedByCurrentUser: Boolean + contributionsCount: Int + commentsCount: Int + commentedCount: Int + shoutedCount: Int + badgesCount: Int + first: Int + offset: Int + orderBy: [_UserOrdering] + filter: _UserFilter + ): [User] +} + +type Mutation { + UpdateUser ( + id: ID! + name: String + email: String + slug: String + avatar: String + coverImg: String + avatarUpload: Upload + locationName: String + about: String + ): User + + DeleteUser(id: ID!, resource: [Deletable]): User +} diff --git a/backend/src/seed/factories/index.js b/backend/src/seed/factories/index.js index 211edf87e..b2cf2de45 100644 --- a/backend/src/seed/factories/index.js +++ b/backend/src/seed/factories/index.js @@ -1,5 +1,5 @@ import { GraphQLClient, request } from 'graphql-request' -import { getDriver } from '../../bootstrap/neo4j' +import { getDriver, neode } from '../../bootstrap/neo4j' import createBadge from './badges.js' import createUser from './users.js' import createOrganization from './organizations.js' @@ -48,7 +48,11 @@ export const cleanDatabase = async (options = {}) => { } export default function Factory(options = {}) { - const { neo4jDriver = getDriver(), seedServerHost = 'http://127.0.0.1:4001' } = options + let { + seedServerHost = 'http://127.0.0.1:4001', + neo4jDriver = getDriver(), + neodeInstance = neode(), + } = options const graphQLClient = new GraphQLClient(seedServerHost) @@ -58,19 +62,23 @@ export default function Factory(options = {}) { graphQLClient, factories, lastResponse: null, + neodeInstance, async authenticateAs({ email, password }) { const headers = await authenticatedHeaders({ email, password }, seedServerHost) this.lastResponse = headers this.graphQLClient = new GraphQLClient(seedServerHost, { headers }) return this }, - async create(node, properties) { - const { mutation, variables } = this.factories[node](properties) - this.lastResponse = await this.graphQLClient.request(mutation, variables) + async create(node, args = {}) { + const { factory, mutation, variables } = this.factories[node](args) + if (factory) { + this.lastResponse = await factory({ args, neodeInstance }) + } else { + this.lastResponse = await this.graphQLClient.request(mutation, variables) + } return this }, - async relate(node, relationship, properties) { - const { from, to } = properties + async relate(node, relationship, { from, to }) { const mutation = ` mutation { Add${node}${relationship}( @@ -112,6 +120,11 @@ export default function Factory(options = {}) { this.lastResponse = await this.graphQLClient.request(mutation) return this }, + async invite({ email }) { + const mutation = ` mutation($email: String!) { invite( email: $email) } ` + this.lastResponse = await this.graphQLClient.request(mutation, { email }) + return this + }, async cleanDatabase() { this.lastResponse = await cleanDatabase({ driver: this.neo4jDriver }) return this @@ -121,6 +134,9 @@ export default function Factory(options = {}) { result.create.bind(result) result.relate.bind(result) result.mutate.bind(result) + result.shout.bind(result) + result.follow.bind(result) + result.invite.bind(result) result.cleanDatabase.bind(result) return result } diff --git a/backend/src/seed/factories/users.js b/backend/src/seed/factories/users.js index ca17d1721..ffe8e7a39 100644 --- a/backend/src/seed/factories/users.js +++ b/backend/src/seed/factories/users.js @@ -1,51 +1,28 @@ import faker from 'faker' import uuid from 'uuid/v4' +import encryptPassword from '../../helpers/encryptPassword' +import slugify from 'slug' export default function create(params) { - const { - id = uuid(), - name = faker.name.findName(), - slug = '', - email = faker.internet.email(), - password = '1234', - role = 'user', - avatar = faker.internet.avatar(), - about = faker.lorem.paragraph(), - } = params - return { - mutation: ` - mutation( - $id: ID! - $name: String - $slug: String - $password: String! - $email: String! - $avatar: String - $about: String - $role: UserGroup - ) { - CreateUser( - id: $id - name: $name - slug: $slug - password: $password - email: $email - avatar: $avatar - about: $about - role: $role - ) { - id - name - slug - email - avatar - role - deleted - disabled - } + factory: async ({ args, neodeInstance }) => { + const defaults = { + id: uuid(), + name: faker.name.findName(), + email: faker.internet.email(), + password: '1234', + role: 'user', + avatar: faker.internet.avatar(), + about: faker.lorem.paragraph(), } - `, - variables: { id, name, slug, password, email, avatar, about, role }, + defaults.slug = slugify(defaults.name, { lower: true }) + args = { + ...defaults, + ...args, + } + args = await encryptPassword(args) + const user = await neodeInstance.create('User', args) + return user.toJson() + }, } } diff --git a/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js index 27c07868d..18eefb76f 100644 --- a/backend/src/seed/seed-db.js +++ b/backend/src/seed/seed-db.js @@ -69,47 +69,144 @@ import Factory from './factories' role: 'user', email: 'user@example.org', }), - f.create('User', { id: 'u4', name: 'Tick', role: 'user', email: 'tick@example.org' }), - f.create('User', { id: 'u5', name: 'Trick', role: 'user', email: 'trick@example.org' }), - f.create('User', { id: 'u6', name: 'Track', role: 'user', email: 'track@example.org' }), - f.create('User', { id: 'u7', name: 'Dagobert', role: 'user', email: 'dagobert@example.org' }), + f.create('User', { + id: 'u4', + name: 'Tick', + role: 'user', + email: 'tick@example.org', + }), + f.create('User', { + id: 'u5', + name: 'Trick', + role: 'user', + email: 'trick@example.org', + }), + f.create('User', { + id: 'u6', + name: 'Track', + role: 'user', + email: 'track@example.org', + }), + f.create('User', { + id: 'u7', + name: 'Dagobert', + role: 'user', + email: 'dagobert@example.org', + }), ]) const [asAdmin, asModerator, asUser, asTick, asTrick, asTrack] = await Promise.all([ - Factory().authenticateAs({ email: 'admin@example.org', password: '1234' }), - Factory().authenticateAs({ email: 'moderator@example.org', password: '1234' }), - Factory().authenticateAs({ email: 'user@example.org', password: '1234' }), - Factory().authenticateAs({ email: 'tick@example.org', password: '1234' }), - Factory().authenticateAs({ email: 'trick@example.org', password: '1234' }), - Factory().authenticateAs({ email: 'track@example.org', password: '1234' }), + Factory().authenticateAs({ + email: 'admin@example.org', + password: '1234', + }), + Factory().authenticateAs({ + email: 'moderator@example.org', + password: '1234', + }), + Factory().authenticateAs({ + email: 'user@example.org', + password: '1234', + }), + Factory().authenticateAs({ + email: 'tick@example.org', + password: '1234', + }), + Factory().authenticateAs({ + email: 'trick@example.org', + password: '1234', + }), + Factory().authenticateAs({ + email: 'track@example.org', + password: '1234', + }), ]) await Promise.all([ - f.relate('User', 'Badges', { from: 'b6', to: 'u1' }), - f.relate('User', 'Badges', { from: 'b5', to: 'u2' }), - f.relate('User', 'Badges', { from: 'b4', to: 'u3' }), - f.relate('User', 'Badges', { from: 'b3', to: 'u4' }), - f.relate('User', 'Badges', { from: 'b2', to: 'u5' }), - f.relate('User', 'Badges', { from: 'b1', to: 'u6' }), - f.relate('User', 'Friends', { from: 'u1', to: 'u2' }), - f.relate('User', 'Friends', { from: 'u1', to: 'u3' }), - f.relate('User', 'Friends', { from: 'u2', to: 'u3' }), - f.relate('User', 'Blacklisted', { from: 'u7', to: 'u4' }), - f.relate('User', 'Blacklisted', { from: 'u7', to: 'u5' }), - f.relate('User', 'Blacklisted', { from: 'u7', to: 'u6' }), + f.relate('User', 'Badges', { + from: 'b6', + to: 'u1', + }), + f.relate('User', 'Badges', { + from: 'b5', + to: 'u2', + }), + f.relate('User', 'Badges', { + from: 'b4', + to: 'u3', + }), + f.relate('User', 'Badges', { + from: 'b3', + to: 'u4', + }), + f.relate('User', 'Badges', { + from: 'b2', + to: 'u5', + }), + f.relate('User', 'Badges', { + from: 'b1', + to: 'u6', + }), + f.relate('User', 'Friends', { + from: 'u1', + to: 'u2', + }), + f.relate('User', 'Friends', { + from: 'u1', + to: 'u3', + }), + f.relate('User', 'Friends', { + from: 'u2', + to: 'u3', + }), + f.relate('User', 'Blacklisted', { + from: 'u7', + to: 'u4', + }), + f.relate('User', 'Blacklisted', { + from: 'u7', + to: 'u5', + }), + f.relate('User', 'Blacklisted', { + from: 'u7', + to: 'u6', + }), ]) await Promise.all([ - asAdmin.follow({ id: 'u3', type: 'User' }), - asModerator.follow({ id: 'u4', type: 'User' }), - asUser.follow({ id: 'u4', type: 'User' }), - asTick.follow({ id: 'u6', type: 'User' }), - asTrick.follow({ id: 'u4', type: 'User' }), - asTrack.follow({ id: 'u3', type: 'User' }), + asAdmin.follow({ + id: 'u3', + type: 'User', + }), + asModerator.follow({ + id: 'u4', + type: 'User', + }), + asUser.follow({ + id: 'u4', + type: 'User', + }), + asTick.follow({ + id: 'u6', + type: 'User', + }), + asTrick.follow({ + id: 'u4', + type: 'User', + }), + asTrack.follow({ + id: 'u3', + type: 'User', + }), ]) await Promise.all([ - f.create('Category', { id: 'cat1', name: 'Just For Fun', slug: 'justforfun', icon: 'smile' }), + f.create('Category', { + id: 'cat1', + name: 'Just For Fun', + slug: 'justforfun', + icon: 'smile', + }), f.create('Category', { id: 'cat2', name: 'Happyness & Values', @@ -203,10 +300,22 @@ import Factory from './factories' ]) await Promise.all([ - f.create('Tag', { id: 't1', name: 'Umwelt' }), - f.create('Tag', { id: 't2', name: 'Naturschutz' }), - f.create('Tag', { id: 't3', name: 'Demokratie' }), - f.create('Tag', { id: 't4', name: 'Freiheit' }), + f.create('Tag', { + id: 'Umwelt', + name: 'Umwelt', + }), + f.create('Tag', { + id: 'Naturschutz', + name: 'Naturschutz', + }), + f.create('Tag', { + id: 'Demokratie', + name: 'Demokratie', + }), + f.create('Tag', { + id: 'Freiheit', + name: 'Freiheit', + }), ]) const mention1 = 'Hey @jenny-rostock, what\'s up?' @@ -214,108 +323,347 @@ import Factory from './factories' 'Hey @jenny-rostock, here is another notification for you!' await Promise.all([ - asAdmin.create('Post', { id: 'p0', image: faker.image.unsplash.food() }), - asModerator.create('Post', { id: 'p1', image: faker.image.unsplash.technology() }), - asUser.create('Post', { id: 'p2' }), - asTick.create('Post', { id: 'p3' }), - asTrick.create('Post', { id: 'p4' }), - asTrack.create('Post', { id: 'p5' }), - asAdmin.create('Post', { id: 'p6', image: faker.image.unsplash.buildings() }), - asModerator.create('Post', { id: 'p7', content: `${mention1} ${faker.lorem.paragraph()}` }), - asUser.create('Post', { id: 'p8', image: faker.image.unsplash.nature() }), - asTick.create('Post', { id: 'p9' }), - asTrick.create('Post', { id: 'p10' }), - asTrack.create('Post', { id: 'p11', image: faker.image.unsplash.people() }), - asAdmin.create('Post', { id: 'p12', content: `${mention2} ${faker.lorem.paragraph()}` }), - asModerator.create('Post', { id: 'p13' }), - asUser.create('Post', { id: 'p14', image: faker.image.unsplash.objects() }), - asTick.create('Post', { id: 'p15' }), + asAdmin.create('Post', { + id: 'p0', + image: faker.image.unsplash.food(), + }), + asModerator.create('Post', { + id: 'p1', + image: faker.image.unsplash.technology(), + }), + asUser.create('Post', { + id: 'p2', + }), + asTick.create('Post', { + id: 'p3', + }), + asTrick.create('Post', { + id: 'p4', + }), + asTrack.create('Post', { + id: 'p5', + }), + asAdmin.create('Post', { + id: 'p6', + image: faker.image.unsplash.buildings(), + }), + asModerator.create('Post', { + id: 'p7', + content: `${mention1} ${faker.lorem.paragraph()}`, + }), + asUser.create('Post', { + id: 'p8', + image: faker.image.unsplash.nature(), + }), + asTick.create('Post', { + id: 'p9', + }), + asTrick.create('Post', { + id: 'p10', + }), + asTrack.create('Post', { + id: 'p11', + image: faker.image.unsplash.people(), + }), + asAdmin.create('Post', { + id: 'p12', + content: `${mention2} ${faker.lorem.paragraph()}`, + }), + asModerator.create('Post', { + id: 'p13', + }), + asUser.create('Post', { + id: 'p14', + image: faker.image.unsplash.objects(), + }), + asTick.create('Post', { + id: 'p15', + }), ]) await Promise.all([ - f.relate('Post', 'Categories', { from: 'p0', to: 'cat16' }), - f.relate('Post', 'Categories', { from: 'p1', to: 'cat1' }), - f.relate('Post', 'Categories', { from: 'p2', to: 'cat2' }), - f.relate('Post', 'Categories', { from: 'p3', to: 'cat3' }), - f.relate('Post', 'Categories', { from: 'p4', to: 'cat4' }), - f.relate('Post', 'Categories', { from: 'p5', to: 'cat5' }), - f.relate('Post', 'Categories', { from: 'p6', to: 'cat6' }), - f.relate('Post', 'Categories', { from: 'p7', to: 'cat7' }), - f.relate('Post', 'Categories', { from: 'p8', to: 'cat8' }), - f.relate('Post', 'Categories', { from: 'p9', to: 'cat9' }), - f.relate('Post', 'Categories', { from: 'p10', to: 'cat10' }), - f.relate('Post', 'Categories', { from: 'p11', to: 'cat11' }), - f.relate('Post', 'Categories', { from: 'p12', to: 'cat12' }), - f.relate('Post', 'Categories', { from: 'p13', to: 'cat13' }), - f.relate('Post', 'Categories', { from: 'p14', to: 'cat14' }), - f.relate('Post', 'Categories', { from: 'p15', to: 'cat15' }), + f.relate('Post', 'Categories', { + from: 'p0', + to: 'cat16', + }), + f.relate('Post', 'Categories', { + from: 'p1', + to: 'cat1', + }), + f.relate('Post', 'Categories', { + from: 'p2', + to: 'cat2', + }), + f.relate('Post', 'Categories', { + from: 'p3', + to: 'cat3', + }), + f.relate('Post', 'Categories', { + from: 'p4', + to: 'cat4', + }), + f.relate('Post', 'Categories', { + from: 'p5', + to: 'cat5', + }), + f.relate('Post', 'Categories', { + from: 'p6', + to: 'cat6', + }), + f.relate('Post', 'Categories', { + from: 'p7', + to: 'cat7', + }), + f.relate('Post', 'Categories', { + from: 'p8', + to: 'cat8', + }), + f.relate('Post', 'Categories', { + from: 'p9', + to: 'cat9', + }), + f.relate('Post', 'Categories', { + from: 'p10', + to: 'cat10', + }), + f.relate('Post', 'Categories', { + from: 'p11', + to: 'cat11', + }), + f.relate('Post', 'Categories', { + from: 'p12', + to: 'cat12', + }), + f.relate('Post', 'Categories', { + from: 'p13', + to: 'cat13', + }), + f.relate('Post', 'Categories', { + from: 'p14', + to: 'cat14', + }), + f.relate('Post', 'Categories', { + from: 'p15', + to: 'cat15', + }), - f.relate('Post', 'Tags', { from: 'p0', to: 't4' }), - f.relate('Post', 'Tags', { from: 'p1', to: 't1' }), - f.relate('Post', 'Tags', { from: 'p2', to: 't2' }), - f.relate('Post', 'Tags', { from: 'p3', to: 't3' }), - f.relate('Post', 'Tags', { from: 'p4', to: 't4' }), - f.relate('Post', 'Tags', { from: 'p5', to: 't1' }), - f.relate('Post', 'Tags', { from: 'p6', to: 't2' }), - f.relate('Post', 'Tags', { from: 'p7', to: 't3' }), - f.relate('Post', 'Tags', { from: 'p8', to: 't4' }), - f.relate('Post', 'Tags', { from: 'p9', to: 't1' }), - f.relate('Post', 'Tags', { from: 'p10', to: 't2' }), - f.relate('Post', 'Tags', { from: 'p11', to: 't3' }), - f.relate('Post', 'Tags', { from: 'p12', to: 't4' }), - f.relate('Post', 'Tags', { from: 'p13', to: 't1' }), - f.relate('Post', 'Tags', { from: 'p14', to: 't2' }), - f.relate('Post', 'Tags', { from: 'p15', to: 't3' }), + f.relate('Post', 'Tags', { + from: 'p0', + to: 'Freiheit', + }), + f.relate('Post', 'Tags', { + from: 'p1', + to: 'Umwelt', + }), + f.relate('Post', 'Tags', { + from: 'p2', + to: 'Naturschutz', + }), + f.relate('Post', 'Tags', { + from: 'p3', + to: 'Demokratie', + }), + f.relate('Post', 'Tags', { + from: 'p4', + to: 'Freiheit', + }), + f.relate('Post', 'Tags', { + from: 'p5', + to: 'Umwelt', + }), + f.relate('Post', 'Tags', { + from: 'p6', + to: 'Naturschutz', + }), + f.relate('Post', 'Tags', { + from: 'p7', + to: 'Demokratie', + }), + f.relate('Post', 'Tags', { + from: 'p8', + to: 'Freiheit', + }), + f.relate('Post', 'Tags', { + from: 'p9', + to: 'Umwelt', + }), + f.relate('Post', 'Tags', { + from: 'p10', + to: 'Naturschutz', + }), + f.relate('Post', 'Tags', { + from: 'p11', + to: 'Demokratie', + }), + f.relate('Post', 'Tags', { + from: 'p12', + to: 'Freiheit', + }), + f.relate('Post', 'Tags', { + from: 'p13', + to: 'Umwelt', + }), + f.relate('Post', 'Tags', { + from: 'p14', + to: 'Naturschutz', + }), + f.relate('Post', 'Tags', { + from: 'p15', + to: 'Demokratie', + }), ]) await Promise.all([ - asAdmin.shout({ id: 'p2', type: 'Post' }), - asAdmin.shout({ id: 'p6', type: 'Post' }), - asModerator.shout({ id: 'p0', type: 'Post' }), - asModerator.shout({ id: 'p6', type: 'Post' }), - asUser.shout({ id: 'p6', type: 'Post' }), - asUser.shout({ id: 'p7', type: 'Post' }), - asTick.shout({ id: 'p8', type: 'Post' }), - asTick.shout({ id: 'p9', type: 'Post' }), - asTrack.shout({ id: 'p10', type: 'Post' }), + asAdmin.shout({ + id: 'p2', + type: 'Post', + }), + asAdmin.shout({ + id: 'p6', + type: 'Post', + }), + asModerator.shout({ + id: 'p0', + type: 'Post', + }), + asModerator.shout({ + id: 'p6', + type: 'Post', + }), + asUser.shout({ + id: 'p6', + type: 'Post', + }), + asUser.shout({ + id: 'p7', + type: 'Post', + }), + asTick.shout({ + id: 'p8', + type: 'Post', + }), + asTick.shout({ + id: 'p9', + type: 'Post', + }), + asTrack.shout({ + id: 'p10', + type: 'Post', + }), ]) await Promise.all([ - asAdmin.shout({ id: 'p2', type: 'Post' }), - asAdmin.shout({ id: 'p6', type: 'Post' }), - asModerator.shout({ id: 'p0', type: 'Post' }), - asModerator.shout({ id: 'p6', type: 'Post' }), - asUser.shout({ id: 'p6', type: 'Post' }), - asUser.shout({ id: 'p7', type: 'Post' }), - asTick.shout({ id: 'p8', type: 'Post' }), - asTick.shout({ id: 'p9', type: 'Post' }), - asTrack.shout({ id: 'p10', type: 'Post' }), + asAdmin.shout({ + id: 'p2', + type: 'Post', + }), + asAdmin.shout({ + id: 'p6', + type: 'Post', + }), + asModerator.shout({ + id: 'p0', + type: 'Post', + }), + asModerator.shout({ + id: 'p6', + type: 'Post', + }), + asUser.shout({ + id: 'p6', + type: 'Post', + }), + asUser.shout({ + id: 'p7', + type: 'Post', + }), + asTick.shout({ + id: 'p8', + type: 'Post', + }), + asTick.shout({ + id: 'p9', + type: 'Post', + }), + asTrack.shout({ + id: 'p10', + type: 'Post', + }), ]) await Promise.all([ - asUser.create('Comment', { id: 'c1', postId: 'p1' }), - asTick.create('Comment', { id: 'c2', postId: 'p1' }), - asTrack.create('Comment', { id: 'c3', postId: 'p3' }), - asTrick.create('Comment', { id: 'c4', postId: 'p2' }), - asModerator.create('Comment', { id: 'c5', postId: 'p3' }), - asAdmin.create('Comment', { id: 'c6', postId: 'p4' }), - asUser.create('Comment', { id: 'c7', postId: 'p2' }), - asTick.create('Comment', { id: 'c8', postId: 'p15' }), - asTrick.create('Comment', { id: 'c9', postId: 'p15' }), - asTrack.create('Comment', { id: 'c10', postId: 'p15' }), - asUser.create('Comment', { id: 'c11', postId: 'p15' }), - asUser.create('Comment', { id: 'c12', postId: 'p15' }), + asUser.create('Comment', { + id: 'c1', + postId: 'p1', + }), + asTick.create('Comment', { + id: 'c2', + postId: 'p1', + }), + asTrack.create('Comment', { + id: 'c3', + postId: 'p3', + }), + asTrick.create('Comment', { + id: 'c4', + postId: 'p2', + }), + asModerator.create('Comment', { + id: 'c5', + postId: 'p3', + }), + asAdmin.create('Comment', { + id: 'c6', + postId: 'p4', + }), + asUser.create('Comment', { + id: 'c7', + postId: 'p2', + }), + asTick.create('Comment', { + id: 'c8', + postId: 'p15', + }), + asTrick.create('Comment', { + id: 'c9', + postId: 'p15', + }), + asTrack.create('Comment', { + id: 'c10', + postId: 'p15', + }), + asUser.create('Comment', { + id: 'c11', + postId: 'p15', + }), + asUser.create('Comment', { + id: 'c12', + postId: 'p15', + }), ]) const disableMutation = 'mutation($id: ID!) { disable(id: $id) }' await Promise.all([ - asModerator.mutate(disableMutation, { id: 'p11' }), - asModerator.mutate(disableMutation, { id: 'c5' }), + asModerator.mutate(disableMutation, { + id: 'p11', + }), + asModerator.mutate(disableMutation, { + id: 'c5', + }), ]) await Promise.all([ - asTick.create('Report', { description: "I don't like this comment", id: 'c1' }), - asTrick.create('Report', { description: "I don't like this post", id: 'p1' }), - asTrack.create('Report', { description: "I don't like this user", id: 'u1' }), + asTick.create('Report', { + description: "I don't like this comment", + id: 'c1', + }), + asTrick.create('Report', { + description: "I don't like this post", + id: 'p1', + }), + asTrack.create('Report', { + description: "I don't like this user", + id: 'u1', + }), ]) await Promise.all([ @@ -342,13 +690,26 @@ import Factory from './factories' ]) await Promise.all([ - f.relate('Organization', 'CreatedBy', { from: 'u1', to: 'o1' }), - f.relate('Organization', 'CreatedBy', { from: 'u1', to: 'o2' }), - f.relate('Organization', 'OwnedBy', { from: 'u2', to: 'o2' }), - f.relate('Organization', 'OwnedBy', { from: 'u2', to: 'o3' }), + f.relate('Organization', 'CreatedBy', { + from: 'u1', + to: 'o1', + }), + f.relate('Organization', 'CreatedBy', { + from: 'u1', + to: 'o2', + }), + f.relate('Organization', 'OwnedBy', { + from: 'u2', + to: 'o2', + }), + f.relate('Organization', 'OwnedBy', { + from: 'u2', + to: 'o3', + }), ]) /* eslint-disable-next-line no-console */ console.log('Seeded Data...') + process.exit(0) } catch (err) { /* eslint-disable-next-line no-console */ console.error(err) diff --git a/backend/yarn.lock b/backend/yarn.lock index 53075537f..398bcc61a 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -14,10 +14,10 @@ resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.20.tgz#bf9f2acdf319c0959fad8ec1239741dd2ead4e8d" integrity sha512-3LWZa80HcP70Pl+H4KhLDJ7S0px+9/c8GTXdl6SpunRecUaB27g/oOQnAjNHLHdbWuGE0uyqcuGiTfbKB3ilaQ== -"@babel/cli@~7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.4.4.tgz#5454bb7112f29026a4069d8e6f0e1794e651966c" - integrity sha512-XGr5YjQSjgTa6OzQZY57FAJsdeVSAKR/u/KA5exWIz66IKtv/zXtHy+fIZcMry/EgYegwuHE7vzGnrFhjdIAsQ== +"@babel/cli@~7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.0.tgz#f403c930692e28ecfa3bf02a9e7562b474f38271" + integrity sha512-qNH55fWbKrEsCwID+Qc/3JDPnsSGpIIiMDbppnR8Z6PxLAqMQCFNqBctkIkBrMH49Nx+qqVTrHRWUR+ho2k+qQ== dependencies: commander "^2.8.1" convert-source-map "^1.1.0" @@ -38,18 +38,18 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@^7.1.0", "@babel/core@~7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" - integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== +"@babel/core@^7.1.0", "@babel/core@~7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.4.tgz#4c32df7ad5a58e9ea27ad025c11276324e0b4ddd" + integrity sha512-+DaeBEpYq6b2+ZmHx3tHspC+ZRflrvLqwfv8E3hNr5LVQoyBnL8RPKSBCg+rK2W2My9PWlujBiqd0ZPsR9Q6zQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.5" + "@babel/generator" "^7.5.0" + "@babel/helpers" "^7.5.4" + "@babel/parser" "^7.5.0" "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.5" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" @@ -58,12 +58,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== +"@babel/generator@^7.0.0", "@babel/generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" + integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.5.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -260,14 +260,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@babel/helpers@^7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.4.tgz#2f00608aa10d460bde0ccf665d6dcf8477357cf0" + integrity sha512-6LJ6xwUEJP51w0sIgKyfvFMJvIb9mWAfohJp0+m6eHJigkFdcH8duZ1sfhn0ltJRzwUIT/yqqhdSfRpCpL7oow== dependencies: "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.0" + "@babel/types" "^7.5.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -278,10 +278,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/node@~7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.4.5.tgz#bce71bb44d902bfdd4da0b9c839a8a90fc084056" - integrity sha512-nDXPT0KwYMycDHhFG9wKlkipCR+iXzzoX9bD2aF2UABLhQ13AKhNi5Y61W8ASGPPll/7p9GrHesmlOgTUJVcfw== +"@babel/node@~7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.5.0.tgz#bcc5a286317ad771703889fb658e1f768c0a2a2e" + integrity sha512-VBlCrbJp7HDrKt4HRbtfq4Rs/XjBokvkfxXRQs4qA1C6eV3JycSOMELx4BFTPFRd9QnNA4PsIRfnvJqe/3tHow== dependencies: "@babel/polyfill" "^7.0.0" "@babel/register" "^7.0.0" @@ -290,10 +290,10 @@ node-environment-flags "^1.0.5" v8flags "^3.1.1" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" - integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.4", "@babel/parser@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" + integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -304,6 +304,14 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -312,10 +320,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" - integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== +"@babel/plugin-proposal-object-rest-spread@^7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz#250de35d867ce8260a31b1fdac6c4fc1baa99331" + integrity sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -352,6 +360,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" @@ -387,10 +402,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" - integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -432,10 +447,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" - integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== +"@babel/plugin-transform-destructuring@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" + integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -448,10 +463,10 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -492,30 +507,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== +"@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== +"@babel/plugin-transform-modules-commonjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" + integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== dependencies: "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" - integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== dependencies: "@babel/helper-hoist-variables" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" @@ -631,39 +649,41 @@ core-js "^2.5.7" regenerator-runtime "^0.12.0" -"@babel/preset-env@~7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" - integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== +"@babel/preset-env@~7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.4.tgz#64bc15041a3cbb0798930319917e70fcca57713d" + integrity sha512-hFnFnouyRNiH1rL8YkX1ANCNAUVC8Djwdqfev8i1415tnAG+7hlA5zhZ0Q/3Q5gkop4HioIPbCEWAalqcbxRoQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-object-rest-spread" "^7.5.4" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" "@babel/plugin-transform-block-scoping" "^7.4.4" "@babel/plugin-transform-classes" "^7.4.4" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-destructuring" "^7.5.0" "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" "@babel/plugin-transform-for-of" "^7.4.4" "@babel/plugin-transform-function-name" "^7.4.4" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.4" - "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" "@babel/plugin-transform-new-target" "^7.4.4" @@ -678,7 +698,7 @@ "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/types" "^7.5.0" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" @@ -704,6 +724,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.4.4": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" @@ -713,25 +740,25 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" - integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" + integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" + "@babel/generator" "^7.5.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/types" "^7.4.4" + "@babel/parser" "^7.5.0" + "@babel/types" "^7.5.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" + integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== dependencies: esutils "^2.0.2" lodash "^4.17.11" @@ -745,6 +772,43 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@hapi/address@2.x.x": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a" + integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw== + +"@hapi/hoek@6.x.x": + version "6.2.4" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595" + integrity sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A== + +"@hapi/hoek@8.x.x": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.0.1.tgz#9712fa2ad124ac64668ab06ba847b1eaf83a03fd" + integrity sha512-cctMYH5RLbElaUpZn3IJaUj9QNQD8iXDnl7xNY6KB1aFD2ciJrwpo3kvZowIT75uA+silJFDnSR2kGakALUymg== + +"@hapi/joi@^15.1.0": + version "15.1.0" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.0.tgz#940cb749b5c55c26ab3b34ce362e82b6162c8e7a" + integrity sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/hoek" "6.x.x" + "@hapi/marker" "1.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/marker@1.x.x": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@hapi/marker/-/marker-1.0.0.tgz#65b0b2b01d1be06304886ce9b4b77b1bfb21a769" + integrity sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA== + +"@hapi/topo@3.x.x": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.2.tgz#57cc1317be1a8c5f47c124f9b0e3c49cd78424d2" + integrity sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA== + dependencies: + "@hapi/hoek" "8.x.x" + "@jest/console@^24.7.1": version "24.7.1" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" @@ -1110,10 +1174,10 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0" integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA== -"@types/yup@0.26.20": - version "0.26.20" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.20.tgz#3b85a05f5dd76e2e8475abb6a8aeae7777627143" - integrity sha512-LpCsA6NG7vIU7Umv1k4w3YGIBH5ZLZRPEKo8vJLHVbBUqRy2WaJ002kbsRqcwODpkICAOMuyGOqLQJa5isZ8+g== +"@types/yup@0.26.21": + version "0.26.21" + resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.21.tgz#bfca27a02a0631495bfd25b6c63647a125e6944e" + integrity sha512-1C45M7hZrVsl8bXxYV01bitRp0r35djt+eX5HWFH3NdH+8ejqta3KM7rmQLRLrupkhF7jRkAtXl2EgDsriIqwA== "@types/zen-observable@^0.5.3": version "0.5.4" @@ -1448,6 +1512,32 @@ apollo-server-core@2.6.7: subscriptions-transport-ws "^0.9.11" ws "^6.0.0" +apollo-server-core@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.6.8.tgz#c8758b5f26b5f3b9fef51b911265b80a9ce5251d" + integrity sha512-Jxw+6R/2I2LiZ6kjRFTzPpdjw7HfuVLfNU+svgNlxioLducxBH/wqUs3qYTf4eVUUtWy+nSS/BUf/Ullo+Ur0Q== + dependencies: + "@apollographql/apollo-tools" "^0.3.6" + "@apollographql/graphql-playground-html" "1.6.20" + "@types/ws" "^6.0.0" + apollo-cache-control "0.7.4" + apollo-datasource "0.5.0" + apollo-engine-reporting "1.3.5" + apollo-server-caching "0.4.0" + apollo-server-env "2.4.0" + apollo-server-errors "2.3.0" + apollo-server-plugin-base "0.5.7" + apollo-tracing "0.7.3" + fast-json-stable-stringify "^2.0.0" + graphql-extensions "0.7.6" + graphql-subscriptions "^1.0.0" + graphql-tag "^2.9.2" + graphql-tools "^4.0.0" + graphql-upload "^8.0.2" + sha.js "^2.4.11" + subscriptions-transport-ws "^0.9.11" + ws "^6.0.0" + apollo-server-core@^1.3.6, apollo-server-core@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.4.0.tgz#4faff7f110bfdd6c3f47008302ae24140f94c592" @@ -1470,10 +1560,10 @@ apollo-server-errors@2.3.0: resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.0.tgz#700622b66a16dffcad3b017e4796749814edc061" integrity sha512-rUvzwMo2ZQgzzPh2kcJyfbRSfVKRMhfIlhY7BzUfM4x6ZT0aijlgsf714Ll3Mbf5Fxii32kD0A/DmKsTecpccw== -apollo-server-express@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.7.tgz#22307e08b75be1553f4099d00028abe52597767d" - integrity sha512-qbCQM+8LxXpwPNN5Sdvcb+Sne8zuCORFt25HJtPJRkHlyBUzOd7JA7SEnUn5e2geTiiGoVIU5leh+++C51udTw== +apollo-server-express@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.6.8.tgz#9f3e29f7087af669f05d75dfd335b4a9383ba48e" + integrity sha512-LQzVHknQDkHWffc2qK9dr/qNxQ/WecSKiye5/w10tXrOy3aruTFe67ysG/vMnFZ/puroqiZ2njHzhHZztqQ4sA== dependencies: "@apollographql/graphql-playground-html" "1.6.20" "@types/accepts" "^1.3.5" @@ -1481,7 +1571,7 @@ apollo-server-express@2.6.7: "@types/cors" "^2.8.4" "@types/express" "4.17.0" accepts "^1.3.5" - apollo-server-core "2.6.7" + apollo-server-core "2.6.8" body-parser "^1.18.3" cors "^2.8.4" graphql-subscriptions "^1.0.0" @@ -1514,20 +1604,25 @@ apollo-server-plugin-base@0.5.6: resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.6.tgz#3a7128437a0f845e7d873fa43ef091ff7bf27975" integrity sha512-wJvcPqfm/kiBwY5JZT85t2A4pcHv24xdQIpWMNt1zsnx77lIZqJmhsc22eSUSrlnYqUMXC4XMVgSUfAO4oI9wg== -apollo-server-testing@~2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.6.7.tgz#cfc6366921eb99fd0cbc5d02552a8a5b268787d5" - integrity sha512-lqgZuSqBd5hkRILeVEleo2ScJjukR/E71Mv67vPBUs01s0gEHNnjSRnuOJJOM3cAFBQOdKPc42cHGANzf2ZZTw== - dependencies: - apollo-server-core "2.6.7" +apollo-server-plugin-base@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.5.7.tgz#267faeb5c2de7fa8d3be469cb99f82f601be7aed" + integrity sha512-HeEwEZ92c2XYRV+0CFLbstW3vUJ4idCxR9E9Q3wwvhXrq8gaGzqyDoC8EzAzRxCJUKcEn7xQOpT/AUTC/KtkRA== -apollo-server@~2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.7.tgz#b707ede529b4d45f2f00a74f3b457658b0e62e83" - integrity sha512-4wk9JykURLed6CnNIj9jhU6ueeTVmGBTyAnnvnlhRrOf50JAFszUErZIKg6lw5vVr5riaByrGFIkMBTySCHgPQ== +apollo-server-testing@~2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.6.8.tgz#e75364df7fdc2d6a11023f8a0f72a14309b90800" + integrity sha512-pch2I+8QhdXBMnGDctVth4BcZ5hocwY/ogtBMoQuv7H2HBnlDOz7dCM9BH4TW3+Tk6cFgvLTaDtLJ+NxMCtyVA== dependencies: - apollo-server-core "2.6.7" - apollo-server-express "2.6.7" + apollo-server-core "2.6.8" + +apollo-server@~2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.6.8.tgz#5f3cf5cf4f2feccbded0cb03fa37dcd8260e5c6a" + integrity sha512-BxwaGxnD3GPuZAAqsexVHFvDlF/s2X8pILgYQ4x+VhUkMeQ12DHQtKPuxn2v2GYwH0U/GDXNohkgwxF/5eTDsQ== + dependencies: + apollo-server-core "2.6.8" + apollo-server-express "2.6.8" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" @@ -1806,6 +1901,13 @@ babel-jest@^24.8.0, babel-jest@~24.8.0: chalk "^2.4.2" slash "^2.0.0" +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-istanbul@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30" @@ -2584,10 +2686,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.0.0-beta.2: - version "2.0.0-beta.2" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-beta.2.tgz#ccd556df832ef761baa88c600f53d2e829245999" - integrity sha512-4cicZF707RNerr3/Q3CcdLo+3OHMCfrRXE7h5iFgn7AMvX07sqKLxSf8Yp+WJW5bvKr2cy9/PkctXLv4iFtOaA== +date-fns@2.0.0-beta.1: + version "2.0.0-beta.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-beta.1.tgz#6f3209ea8be559211be5160e0a6379a7eade227b" + integrity sha512-ls5W/PUZmrtck53HD3Sd0564NlnNoQtcxNCwWcIzULJMNNgAPVKHoylVXPau7vdyu5/JTd25ljtan+iWnnUKkw== debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -2816,6 +2918,11 @@ dotenv@^0.4.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-0.4.0.tgz#f6fb351363c2d92207245c737802c9ab5ae1495a" integrity sha1-9vs1E2PC2SIHJFxzeALJq1rhSVo= +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + integrity sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0= + dotenv@~8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.0.0.tgz#ed310c165b4e8a97bb745b0a9d99c31bda566440" @@ -3053,10 +3160,10 @@ eslint-plugin-import@~2.18.0: read-pkg-up "^2.0.0" resolve "^1.11.0" -eslint-plugin-jest@~22.7.1: - version "22.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.7.1.tgz#5dcdf8f7a285f98040378220d6beca581f0ab2a1" - integrity sha512-CrT3AzA738neimv8G8iK2HCkrCwHnAJeeo7k5TEHK86VMItKl6zdJT/tHBDImfnVVAYsVs4Y6BUdBZQCCgfiyw== +eslint-plugin-jest@~22.7.2: + version "22.7.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.7.2.tgz#7ab118a66a34e46ae5e16a128b5d24fd28b43dca" + integrity sha512-Aecqe3ulBVI7amgOycVI8ZPL8o0SnGHOf3zn2/Ciu8TXyXDHcjtwD3hOs3ss/Qh/VAwlW/DMcuiXg5btgF+XMA== eslint-plugin-node@~9.1.0: version "9.1.0" @@ -3788,12 +3895,12 @@ graphql-request@~1.8.2: dependencies: cross-fetch "2.2.2" -graphql-shield@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-6.0.2.tgz#3ebad8faacbada91b8e576029732e91b5a041c7f" - integrity sha512-3qV2qjeNZla1Fyg6Q2NR5J9AsMaNePLbUboOwhRXB7IcMnTnrxSiVn2R//8VnjnmBjF9rcvgAIAvETZ8AKGfsg== +graphql-shield@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-6.0.3.tgz#a79ca8b2fe58fb9558ffc0e64fa8aa19f63af1b3" + integrity sha512-+yVT/dRWsRqeJOTHcEElJVfvIRPrhBqPlg5FHLmSkWNdGMR4AFqAQGrJteuZuNDvJ3bt380CZ96Bvf4J9hUpKA== dependencies: - "@types/yup" "0.26.20" + "@types/yup" "0.26.21" lightercollective "^0.3.0" object-hash "^1.3.1" yup "^0.27.0" @@ -3866,10 +3973,10 @@ graphql-yoga@~1.18.0: graphql-upload "^8.0.0" subscriptions-transport-ws "^0.9.8" -"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0", graphql@^14.2.1, graphql@~14.4.0: - version "14.4.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.4.0.tgz#e97086acfc0338e4fdc8f7dba519c6b8a6badfd9" - integrity sha512-E55z1oK6e4cGxCqlSsRWytYDPcIUxky3XkbuQUf6TIjCmn6C7CuBJpmkMF1066q95yPAGOZVPTVT7jABKbRFSA== +"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0", graphql@^14.2.1, graphql@~14.4.2: + version "14.4.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.4.2.tgz#553a7d546d524663eda49ed6df77577be3203ae3" + integrity sha512-6uQadiRgnpnSS56hdZUSvFrVcQ6OF9y6wkxJfKquFtHlnl7+KSuWwSJsdwiK1vybm1HgcdbpGkCpvhvsVQ0UZQ== dependencies: iterall "^1.2.2" @@ -4916,7 +5023,7 @@ jmespath@0.15.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc= -joi@^13.0.0: +joi@^13.0.0, joi@^13.7.0: version "13.7.0" resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== @@ -5294,10 +5401,10 @@ lodash@=3.10.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.13: + version "4.17.13" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" + integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== long@^4.0.0: version "4.0.0" @@ -5604,6 +5711,15 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +neo4j-driver@^1.6.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-1.7.5.tgz#c3fe3677f69c12f26944563d45e7e7d818a685e4" + integrity sha512-xCD2F5+tp/SD9r5avX5bSoY8u8RH2o793xJ9Ikjz1s5qQy7cFxFbbj2c52uz3BVGhRAx/NmB57VjOquYmmxGtw== + dependencies: + "@babel/runtime" "^7.4.4" + text-encoding-utf-8 "^1.0.2" + uri-js "^4.2.2" + neo4j-driver@^1.7.3, neo4j-driver@~1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-1.7.4.tgz#9661cf643b63818bff85e82c4691918e75098c1e" @@ -5623,6 +5739,16 @@ neo4j-graphql-js@^2.6.3: lodash "^4.17.11" neo4j-driver "^1.7.3" +neode@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/neode/-/neode-0.2.16.tgz#20532cc67604fd00cc88de841d422f5238ae5bd3" + integrity sha512-L9p55IDKGzAZsQgHdXrfd2xasDuB46RipcrPw6NP7ESgkmfJMaMWRZ1F3Kv+f4V4U1WnhZ1IILvwVFhYPnpXEg== + dependencies: + dotenv "^4.0.0" + joi "^13.7.0" + neo4j-driver "^1.6.3" + uuid "^3.3.2" + next-tick@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -5860,6 +5986,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-keys@^1.0.11: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -5877,6 +6008,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -7411,6 +7552,11 @@ test-exclude@^5.0.0: read-pkg-up "^4.0.0" require-main-filename "^1.0.1" +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" diff --git a/cypress/features.md b/cypress/features.md index eb8292c3b..3adfd8771 100644 --- a/cypress/features.md +++ b/cypress/features.md @@ -16,7 +16,7 @@ The following features will be implemented. This gets done in three steps: ### User Account -[Cucumber Features](./integration/user_account) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/user_account) * Sign-up * Agree to Data Privacy Statement @@ -34,7 +34,7 @@ The following features will be implemented. This gets done in three steps: ### User Profile -[Cucumber Features](./integration/user_profile) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/user_profile) * Upload and Change Avatar * Upload and Change Profile Picture @@ -59,7 +59,7 @@ The following features will be implemented. This gets done in three steps: ### Posts -[Cucumber Features](./integration/post/) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/post) * Creating Posts * Persistent Links @@ -78,13 +78,13 @@ The following features will be implemented. This gets done in three steps: ### Comments -* Creating Comments +* Creating Comments * Deleting Comments * Editing Comments * Upvote comments of others ### Notifications -[Cucumber features](./integration/notifications) +[Cucumber features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/notifications) * User @-mentionings * Notify authors for comments @@ -94,12 +94,12 @@ The following features will be implemented. This gets done in three steps: * Show Posts by Tiles * Show Posts as List -* Filter by Category \(Health and Wellbeing, Global Peace & Non-Violence, ...\) +* Filter by Category \(Health and Wellbeing, Global Peace & Non-Violence, ...\) * Filter by Mood \(Funny, Happy, Surprised, Cry, Angry, ...\) * Filter by Source \(Connections, Following, Individuals, Non-Profits, ...\) * Filter by Posts & Tools \(Post, Events, CanDos, ...\) * Filter by Format Type \(Text, Pictures, Video, ...\) -* Extended Filter \(Continent, Country, Language, ...\) +* Extended Filter \(Continent, Country, Language, ...\) * Sort Posts by Date * Sort Posts by Shouts * Sort Posts by most Comments @@ -116,7 +116,7 @@ The following features will be implemented. This gets done in three steps: ### Search -[Cucumber Features](./integration/search) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/search) * Search for Categories * Search for Tags @@ -186,13 +186,13 @@ The following features will be implemented. This gets done in three steps: ### More Info -Shows autmatically releated information for existing post. +Shows automatically related information for existing post. * Show related Posts * Show Pros and Cons * Show Bestlist * Show Votes -* Link to corresponding Chatroom +* Link to corresponding Chatroom ### Take Action @@ -237,7 +237,7 @@ Shows automatically related actions for existing post. ### Moderation -[Cucumber Features](./integration/moderation) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/moderation) * Report Button for users for doubtful Content * Moderator Panel @@ -262,7 +262,7 @@ Shows automatically related actions for existing post. ### Internationalization -[Cucumber Features](./integration/internationalization) +[Cucumber Features](https://github.com/Human-Connection/Human-Connection/tree/master/cypress/integration/internationalization) * Frontend UI * Backend Error Messages @@ -276,4 +276,3 @@ Shows automatically related actions for existing post. * Receiving Undo and Delete Activities for Articles and Notes * Serving Webfinger records and Actor Objects * Serving Followers, Following and Outbox collections - diff --git a/cypress/integration/common/steps.js b/cypress/integration/common/steps.js index 73313d331..f996db992 100644 --- a/cypress/integration/common/steps.js +++ b/cypress/integration/common/steps.js @@ -1,5 +1,6 @@ import { Given, When, Then } from "cypress-cucumber-preprocessor/steps"; import { getLangByName } from "../../support/helpers"; +import slugify from 'slug' /* global cy */ @@ -11,6 +12,7 @@ let loginCredentials = { }; const narratorParams = { name: "Peter Pan", + slug: 'peter-pan', avatar: "https://s3.amazonaws.com/uifaces/faces/twitter/nerrsoft/128.jpg", ...loginCredentials }; @@ -171,10 +173,11 @@ When("I press {string}", label => { }); Given("we have the following posts in our database:", table => { - table.hashes().forEach(({ Author, ...postAttributes }) => { + table.hashes().forEach(({ Author, ...postAttributes }, i) => { + Author = Author || `author-${i}` const userAttributes = { name: Author, - email: `${Author}@example.org`, + email: `${slugify(Author, {lower: true})}@example.org`, password: "1234" }; postAttributes.deleted = Boolean(postAttributes.deleted); @@ -273,9 +276,9 @@ When("I fill the password form with:", table => { table = table.rowsHash(); cy.get("input[id=oldPassword]") .type(table["Your old password"]) - .get("input[id=newPassword]") + .get("input[id=password]") .type(table["Your new passsword"]) - .get("input[id=confirmPassword]") + .get("input[id=passwordConfirmation]") .type(table["Confirm new password"]); }); diff --git a/cypress/integration/search/Search.feature b/cypress/integration/search/Search.feature index 71aee608a..c1afc5b97 100644 --- a/cypress/integration/search/Search.feature +++ b/cypress/integration/search/Search.feature @@ -6,9 +6,9 @@ Feature: Search Background: Given I have a user account And we have the following posts in our database: - | Author | id | title | content | - | Brianna Wiest | p1 | 101 Essays that will change the way you think | 101 Essays, of course! | - | Brianna Wiest | p2 | No searched for content | will be found in this post, I guarantee | + | id | title | content | + | p1 | 101 Essays that will change the way you think | 101 Essays, of course! | + | p2 | No searched for content | will be found in this post, I guarantee | Given I am logged in Scenario: Search for specific words diff --git a/cypress/support/factories.js b/cypress/support/factories.js index 3bdb86800..dd16e8198 100644 --- a/cypress/support/factories.js +++ b/cypress/support/factories.js @@ -1,12 +1,15 @@ import Factory from '../../backend/src/seed/factories' import { getDriver } from '../../backend/src/bootstrap/neo4j' +import setupNeode from '../../backend/src/bootstrap/neode' +import neode from 'neode' -const neo4jDriver = getDriver({ +const neo4jConfigs = { uri: Cypress.env('NEO4J_URI'), username: Cypress.env('NEO4J_USERNAME'), password: Cypress.env('NEO4J_PASSWORD') -}) -const factory = Factory({ neo4jDriver }) +} +const neo4jDriver = getDriver(neo4jConfigs) +const factory = Factory({ seedServerHost, neo4jDriver, neodeInstance: setupNeode(neo4jConfigs)}) const seedServerHost = Cypress.env('SEED_SERVER_HOST') beforeEach(async () => { @@ -14,7 +17,7 @@ beforeEach(async () => { }) Cypress.Commands.add('factory', () => { - return Factory({ seedServerHost }) + return Factory({ seedServerHost, neo4jDriver, neodeInstance: setupNeode(neo4jConfigs) }) }) Cypress.Commands.add( diff --git a/deployment/human-connection/deployment-neo4j.yaml b/deployment/human-connection/deployment-neo4j.yaml index 3c4887194..afc03ca0d 100644 --- a/deployment/human-connection/deployment-neo4j.yaml +++ b/deployment/human-connection/deployment-neo4j.yaml @@ -32,21 +32,9 @@ value: 1G - name: NEO4J_dbms_memory_heap_max__size value: 1G - - name: NEO4J_URI - valueFrom: - configMapKeyRef: - name: configmap - key: NEO4J_URI - - name: NEO4J_USER - valueFrom: - configMapKeyRef: - name: configmap - key: NEO4J_USER - - name: NEO4J_AUTH - valueFrom: - configMapKeyRef: - name: configmap - key: NEO4J_AUTH + envFrom: + - configMapRef: + name: configmap ports: - containerPort: 7687 - containerPort: 7474 diff --git a/deployment/human-connection/templates/configmap.template.yaml b/deployment/human-connection/templates/configmap.template.yaml index 762901ae8..2b7ffeeb8 100644 --- a/deployment/human-connection/templates/configmap.template.yaml +++ b/deployment/human-connection/templates/configmap.template.yaml @@ -10,7 +10,8 @@ GRAPHQL_URI: "http://nitro-backend.human-connection:4000" MOCKS: "false" NEO4J_URI: "bolt://nitro-neo4j.human-connection:7687" - NEO4J_USER: "neo4j" + NEO4J_USERNAME: "neo4j" + NEO4J_PASSWORD: "neo4j" NEO4J_AUTH: "none" CLIENT_URI: "https://nitro-staging.human-connection.org" metadata: diff --git a/edit-this-documentation.md b/edit-this-documentation.md index b01ace78f..cd83ac7a6 100644 --- a/edit-this-documentation.md +++ b/edit-this-documentation.md @@ -1,12 +1,6 @@ # Edit this Documentation -Go to the section and theme you want to change: On the left navigator. - -Click **Edit on GitHub** on the right. - -On the **Issue** tab you’ll find the open issues. Read what need to be done by clicking on the issue you like to fix. - -By going backwards in the browser **\(!\)**, again go to the **Code** tab. +Find the [**table of contents** for this documentation on GitHub](https://github.com/Human-Connection/Human-Connection/blob/master/SUMMARY.md) and navigate to the file you need to update. Click on the **edit pencil** on the right side directly above the text to edit this file on your fork of Human Connection \(HC\). @@ -14,7 +8,7 @@ You can see a preview of your changes by clicking the **Preview changes** tab as If you are ready, fill in the **Propose file change** at the end of the webpage. -After that you have to send your change to the HC basis with a pull request. Here make a comment which issue you have fixed. At least the number. +After that you have to send your change to the HC basis with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our [open issues](https://github.com/Human-Connection/Human-Connection/issues) please include the number.) ## Markdown your documentation @@ -117,4 +111,3 @@ TODO: How to modify screenshots in Linux ... {% endhint %} {% endtab %} {% endtabs %} - diff --git a/neo4j/README.md b/neo4j/README.md index 379a89eec..78c4bc62e 100644 --- a/neo4j/README.md +++ b/neo4j/README.md @@ -20,7 +20,7 @@ for an interactive cypher shell and a visualization of the graph. ## Installation without Docker -Install community edition of [Neo4J]() along with the plugin +Install the community edition of [Neo4j](https://neo4j.com/) along with the plugin [Apoc](https://github.com/neo4j-contrib/neo4j-apoc-procedures) on your system. To do so, go to [releases](https://neo4j.com/download-center/#releases), choose @@ -28,7 +28,13 @@ To do so, go to [releases](https://neo4j.com/download-center/#releases), choose and unpack the files. Download [Neo4j Apoc](https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases) -and drop the file into the `plugins` folder of the just extracted Neo4j-Server. +and drop the `.jar` file into the `plugins` folder of the just extracted Neo4j-Server. + +Then make sure to allow Apoc procedures by adding the following line to your Neo4j configuration \(`conf/neo4j.conf`\): + +``` +dbms.security.procedures.unrestricted=apoc.* +``` ### Alternatives @@ -59,6 +65,6 @@ $ cp .env.template .env $ ./db_setup.sh ``` -Otherwise if you don't have `cypher-shell` available, simply copy the cypher -statements [from the script](./neo4j/db_setup.sh) and paste the scripts into your -database [browser frontend](http://localhost:7474). +Otherwise, if you don't have `cypher-shell` available, copy the cypher +statements [from the `db_setup.sh` script](https://github.com/Human-Connection/Human-Connection/blob/master/neo4j/db_setup.sh) and paste the scripts into your +[database browser frontend](http://localhost:7474). diff --git a/package.json b/package.json index 1446f0009..b93b154ac 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,10 @@ "test:jest": "cd webapp && yarn test && cd ../backend && yarn test:jest && codecov" }, "devDependencies": { + "bcryptjs": "^2.4.3", "codecov": "^3.5.0", "cross-env": "^5.2.0", - "cypress": "^3.3.2", + "cypress": "^3.4.0", "cypress-cucumber-preprocessor": "^1.12.0", "cypress-file-upload": "^3.2.0", "cypress-plugin-retries": "^1.2.2", @@ -29,6 +30,8 @@ "faker": "Marak/faker.js#master", "graphql-request": "^1.8.2", "neo4j-driver": "^1.7.5", - "npm-run-all": "^4.1.5" + "neode": "^0.2.16", + "npm-run-all": "^4.1.5", + "slug": "^1.1.0" } } diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 9b7f1329c..d3a17a3aa 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12.5-alpine as base +FROM node:12.6-alpine as base LABEL Description="Web Frontend of the Social Network Human-Connection.org" Vendor="Human-Connection gGmbH" Version="0.0.1" Maintainer="Human-Connection gGmbH (developer@human-connection.org)" EXPOSE 3000 diff --git a/webapp/README.md b/webapp/README.md index ce27eca2f..604c7e6ba 100644 --- a/webapp/README.md +++ b/webapp/README.md @@ -41,4 +41,4 @@ All reusable Components \(for example avatar\) should be done inside the [Nitro- More information can be found here: [https://github.com/Human-Connection/Nitro-Styleguide](https://github.com/Human-Connection/Nitro-Styleguide) -If you need to change something in the styleguide and want to see the effects on the frontend immediately, then we have you covered. You need to clone the styleguide to the parent directory `../Nitro-Styleguide` and run `yarn && yarn run dev`. After that you run `yarn run dev:styleguide` instead of `yarn run dev` and you will see your changes reflected inside the fronten! +If you need to change something in the styleguide and want to see the effects on the frontend immediately, then we have you covered. You need to clone the styleguide to the parent directory `../Nitro-Styleguide` and run `yarn && yarn run dev`. After that you run `yarn run dev:styleguide` instead of `yarn run dev` and you will see your changes reflected inside the frontend! diff --git a/webapp/assets.md b/webapp/assets.md index 06786539d..6ac7dc388 100644 --- a/webapp/assets.md +++ b/webapp/assets.md @@ -1,8 +1,5 @@ # ASSETS -**This directory is not required, you can delete it if you don't want to use it.** - -This directory contains your un-compiled assets such as LESS, SASS, or JavaScript. +This directory contains your un-compiled assets such as LESS, SASS, or JavaScript – in our case SCSS styles. More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked). - diff --git a/webapp/assets/styles/main.scss b/webapp/assets/styles/main.scss index 560249b4a..11652fad0 100644 --- a/webapp/assets/styles/main.scss +++ b/webapp/assets/styles/main.scss @@ -66,7 +66,8 @@ blockquote { border-left: 3px dotted $color-neutral-70; &::before { - content: '\201C'; /*Unicode for Left Double Quote*/ + content: '\201C'; + /*Unicode for Left Double Quote*/ /*Font*/ font-size: $font-size-xxxx-large; diff --git a/webapp/components.md b/webapp/components.md index be43ae454..92b3dd1fb 100644 --- a/webapp/components.md +++ b/webapp/components.md @@ -1,8 +1,5 @@ # COMPONENTS -**This directory is not required, you can delete it if you don't want to use it.** - The components directory contains your Vue.js Components. _Nuxt.js doesn't supercharge these components._ - diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 7eed255a2..349a59574 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -12,7 +12,12 @@ {{ form.title.length }}/64 - + {{ form.contentLength }}/2000 @@ -34,18 +39,19 @@ /> +
          {{ $t('actions.cancel') }} import gql from 'graphql-tag' -import HcEditor from '~/components/Editor' +import HcEditor from '~/components/Editor/Editor' import orderBy from 'lodash/orderBy' import locales from '~/locales' import PostMutations from '~/graphql/PostMutations.js' @@ -99,6 +105,7 @@ export default { slug: null, users: [], n: 0, + hashtags: [], } }, watch: { @@ -205,17 +212,34 @@ export default { apollo: { User: { query() { - return gql(`{ - User(orderBy: slug_asc) { - id - slug + return gql` + { + User(orderBy: slug_asc) { + id + slug + } } - }`) + ` }, result(result) { this.users = result.data.User }, }, + Tag: { + query() { + return gql` + { + Tag(orderBy: name_asc) { + id + name + } + } + ` + }, + result(result) { + this.hashtags = result.data.Tag + }, + }, }, } diff --git a/webapp/components/Editor/spec.js b/webapp/components/Editor/Editor.spec.js similarity index 94% rename from webapp/components/Editor/spec.js rename to webapp/components/Editor/Editor.spec.js index b982d941d..d457609bd 100644 --- a/webapp/components/Editor/spec.js +++ b/webapp/components/Editor/Editor.spec.js @@ -1,5 +1,5 @@ import { mount, createLocalVue } from '@vue/test-utils' -import Editor from './' +import Editor from './Editor' import Vuex from 'vuex' import Styleguide from '@human-connection/styleguide' @@ -36,7 +36,9 @@ describe('Editor.vue', () => { propsData, localVue, sync: false, - stubs: { transition: false }, + stubs: { + transition: false, + }, store, })) } diff --git a/webapp/components/Editor/index.vue b/webapp/components/Editor/Editor.vue similarity index 67% rename from webapp/components/Editor/index.vue rename to webapp/components/Editor/Editor.vue index 84649f436..4413bfa0d 100644 --- a/webapp/components/Editor/index.vue +++ b/webapp/components/Editor/Editor.vue @@ -1,18 +1,51 @@