diff --git a/.codecov.yml b/.codecov.yml index 2767ed675..82b50aba3 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -95,7 +95,7 @@ coverage: # - master #flags: # - integration - paths: + paths: - backend/ # only include coverage in "backend/" folder webapp: # declare a new status context "frontend" against: parent @@ -127,7 +127,7 @@ coverage: # - integration # paths: # - folder - + #changes: # default: # against: parent @@ -150,20 +150,8 @@ coverage: #ignore: # files and folders for processing # - tests/* - + #fixes: # - "old_path::new_path" -comment: - # layout options are quite limited in v4.x - there have been way more options in v1.0 - layout: reach, diff, flags, files # mostly old options: header, diff, uncovered, reach, files, tree, changes, sunburst, flags - behavior: new # default = posts once then update, posts new if delete - # once = post once then updates - # new = delete old, post new - # spammy = post new - require_changes: false # if true: only post the comment if coverage changes - require_base: no # [yes :: must have a base report to post] - require_head: no # [yes :: must have a head report to post] - branches: null # branch names that can post comment - flags: null - paths: null \ No newline at end of file +comment: off diff --git a/.travis.yml b/.travis.yml index 593b83e5f..3c1208496 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ addons: before_install: - yarn global add wait-on # Install Codecov - - yarn global add codecov - yarn install - cp cypress.env.template.json cypress.env.json @@ -40,7 +39,7 @@ script: # Fullstack - yarn run cypress:run # Coverage - - codecov + - yarn run codecov after_success: - wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh diff --git a/backend/package.json b/backend/package.json index a253419c2..6e841d73f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,6 +9,7 @@ "dev": "nodemon --exec babel-node src/ -e js,gql", "dev:debug": "nodemon --exec babel-node --inspect=0.0.0.0:9229 src/index.js -e js,gql", "lint": "eslint src --config .eslintrc.js", + "jest": "jest --forceExit --detectOpenHandles --runInBand", "test": "run-s test:jest test:cucumber", "test:before:server": "cross-env GRAPHQL_URI=http://localhost:4123 GRAPHQL_PORT=4123 yarn run dev 2> /dev/null", "test:before:seeder": "cross-env GRAPHQL_URI=http://localhost:4001 GRAPHQL_PORT=4001 DISABLED_MIDDLEWARES=permissions,activityPub yarn run dev 2> /dev/null", @@ -34,7 +35,6 @@ "!**/src/**/?(*.)+(spec|test).js?(x)" ], "coverageReporters": [ - "text", "lcov" ], "testMatch": [ @@ -48,59 +48,75 @@ "apollo-client": "~2.6.3", "apollo-link-context": "~1.0.18", "apollo-link-http": "~1.5.15", - "apollo-server": "~2.6.8", + "apollo-server": "~2.7.0", + "apollo-server-express": "^2.6.9", "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.1", + "date-fns": "2.0.0-beta.3", "debug": "~4.1.1", "dotenv": "~8.0.0", - "express": "~4.17.1", + "express": "^4.17.1", "faker": "Marak/faker.js#master", "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.3", + "graphql-shield": "~6.0.4", "graphql-tag": "~2.10.1", - "graphql-yoga": "~1.18.0", - "helmet": "~3.18.0", + "helmet": "~3.19.0", "jsonwebtoken": "~8.5.1", "linkifyjs": "~2.1.8", "lodash": "~4.17.14", - "merge-graphql-schemas": "^1.5.8", + "merge-graphql-schemas": "^1.6.1", + "metascraper": "^4.10.3", + "metascraper-audio": "^5.5.0", + "metascraper-author": "^5.6.3", + "metascraper-clearbit-logo": "^5.3.0", + "metascraper-date": "^5.6.3", + "metascraper-description": "^5.5.0", + "metascraper-image": "^5.6.3", + "metascraper-lang": "^5.6.3", + "metascraper-lang-detector": "^4.8.5", + "metascraper-logo": "^5.5.0", + "metascraper-publisher": "^5.6.3", + "metascraper-soundcloud": "^5.5.3", + "metascraper-title": "^5.6.3", + "metascraper-url": "^5.5.0", + "metascraper-video": "^4.8.5", + "metascraper-youtube": "^4.8.5", "neo4j-driver": "~1.7.4", "neo4j-graphql-js": "^2.6.3", "neode": "^0.2.16", "node-fetch": "~2.6.0", - "nodemailer": "^6.2.1", + "nodemailer": "^6.3.0", "npm-run-all": "~4.1.5", "request": "~2.88.0", "sanitize-html": "~1.20.1", "slug": "~1.1.0", "trunc-html": "~1.1.2", "uuid": "~3.3.2", - "wait-on": "~3.2.0" + "wait-on": "~3.3.0" }, "devDependencies": { - "@babel/cli": "~7.5.0", - "@babel/core": "~7.5.4", - "@babel/node": "~7.5.0", + "@babel/cli": "~7.5.5", + "@babel/core": "~7.5.5", + "@babel/node": "~7.5.5", "@babel/plugin-proposal-throw-expressions": "^7.2.0", - "@babel/preset-env": "~7.5.4", - "@babel/register": "~7.4.4", - "apollo-server-testing": "~2.6.8", + "@babel/preset-env": "~7.5.5", + "@babel/register": "~7.5.5", + "apollo-server-testing": "~2.7.0", "babel-core": "~7.0.0-0", "babel-eslint": "~10.0.2", "babel-jest": "~24.8.0", "chai": "~4.2.0", "cucumber": "~5.1.0", - "eslint": "~6.0.1", + "eslint": "~6.1.0", "eslint-config-prettier": "~6.0.0", "eslint-config-standard": "~12.0.0", - "eslint-plugin-import": "~2.18.0", - "eslint-plugin-jest": "~22.7.2", + "eslint-plugin-import": "~2.18.2", + "eslint-plugin-jest": "~22.13.6", "eslint-plugin-node": "~9.1.0", "eslint-plugin-prettier": "~3.1.0", "eslint-plugin-promise": "~4.2.1", diff --git a/backend/src/index.js b/backend/src/index.js index f28e58947..0e7fc233c 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -1,18 +1,8 @@ import createServer from './server' -import ActivityPub from './activitypub/ActivityPub' import CONFIG from './config' -const serverConfig = { - port: CONFIG.GRAPHQL_PORT, - // cors: { - // credentials: true, - // origin: [CONFIG.CLIENT_URI] // your frontend url. - // } -} - -const server = createServer() -server.start(serverConfig, options => { +const { app } = createServer() +app.listen({ port: CONFIG.GRAPHQL_PORT }, () => { /* eslint-disable-next-line no-console */ console.log(`GraphQLServer ready at ${CONFIG.GRAPHQL_URI} 🚀`) - ActivityPub.init(server) }) diff --git a/backend/src/jest/helpers.js b/backend/src/jest/helpers.js index e50f30c64..380aedd16 100644 --- a/backend/src/jest/helpers.js +++ b/backend/src/jest/helpers.js @@ -15,3 +15,9 @@ export async function login(variables) { authorization: `Bearer ${response.login}`, } } + +//* This is a fake ES2015 template string, just to benefit of syntax +// highlighting of `gql` template strings in certain editors. +export function gql(strings) { + return strings.join('') +} diff --git a/backend/src/jest/snapshots/embeds/HumanConnectionOrg.html b/backend/src/jest/snapshots/embeds/HumanConnectionOrg.html new file mode 100644 index 000000000..ed3f96cda --- /dev/null +++ b/backend/src/jest/snapshots/embeds/HumanConnectionOrg.html @@ -0,0 +1,38 @@ + + +Human Connection - Startseite | Facebook + + + + + + + + + + + + + + + + + + + + + + + +
Mehr von Human Connection auf Facebook anzeigen
Mehr von Human Connection auf Facebook anzeigen
oder
Neues Konto erstellen
Willkommen bei Human Connection
Human Connection ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk mit Sitz in Weilheim-T...
Mehr anzeigen
CommunityAlle ansehen
Highlights info row image
24.407 Personen gefällt das
Highlights info row image
25.652 Personen haben das abonniert
Highlights info row image
72 Besuche
Highlights info row image
Bahnhofstraße 11 (512,71 km)
73235 Weilheim an der Teck
Highlights info row image
01514 3804222
Highlights info row image
Preisklasse €
SeitentransparenzMehr anzeigen
Facebook liefert Informationen, mit denen du die Intention von Seiten besser verstehst. Hier erfährst du mehr zu den Personen, die die Seiten verwalten und Beiträge darin posten.
Seite erstellt – 21. Oktober 2015
Ähnliche Seiten
OrteWeilheim an der TeckHuman Connection
Beiträge

Human Connection soll mehr als nur ein einfacher Facebookersatz werden – nämlich vor allem lösungsorientiert und zukunftsfähig. Wir möchten mit unserem Netzwerk dazu beitragen, dass mehr Menschen aktiv werden und selbst etwas verändern. Vor allem möchten wir, dass sie nicht jede negative Neuigkeit in einem sozialen Netzwerk “schlucken” müssen. Der Gedanke man könne doch eh nichts ändern, stimmt nur dann, wenn andere Leser genauso denken. Gemeinsam ist so viel mehr möglich und... dafür braucht es zunächst erst einmal jeden Einzelnen.

Wie kann Human Connection dabei helfen?

Das erfahrt ihr im ganzen Beitrag:
https://human-connection.org/human-connection-loesungsorie…/

Mehr anzeigen
Bild könnte enthalten: Text

Human Connection ist unser Herzensprojekt, welches allerdings uns und auch euch sehr viel Geduld abfordert. Warum dauert das eigentlich so lange?

Hier erfahrt ihr die Antwort:

human-connection.org
Human Connection ist unser Herzensprojekt, welches allerdings uns und auch euch sehr viel Geduld abfordert. Warum dauert das eigentlich so lange?
Videos
Schau es an und Du weißt, was zu tun ist
10
2
Messe Fair Handeln: Human Connection beim Hackathon (Stuttgart 26.-28.04.2019)
9
1
In Nerds We Trust - Open Source - Wir lieben freie Software!
4
1
+ + + + \ No newline at end of file diff --git a/backend/src/jest/snapshots/embeds/babyLovesCat.html b/backend/src/jest/snapshots/embeds/babyLovesCat.html new file mode 100644 index 000000000..88ce2a327 --- /dev/null +++ b/backend/src/jest/snapshots/embeds/babyLovesCat.html @@ -0,0 +1,1545 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +Baby Loves Cat - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ DE +
+
+
+ +
+
+
+

+ + + +Wird geladen... + +

+ +
+
+
+ +
+ +
+
+
+ +Du siehst YouTube auf Deutsch. +Du kannst diese Einstellung unten ändern. +
+
+ + You're viewing YouTube in German. + You can change this preference below. +
+
+
+ +
+
+ +
+
+ + +
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

+ + + + + Baby Loves Cat + + +

+
+
+ + +
+ + + + + +
+
30.160.931 Aufrufe
+
+
+
+
+
+ + + + + +
+
+ + + +
+
+
+
+

+ + + +Wird geladen... + +

+ +
+
+
+ +
+ +
+
+
+

+ + + +Wird geladen... + +

+ +
+
+
+

+Transkript +

+
+ +
+ + + +
+
+Das interaktive Transkript konnte nicht geladen werden. +
+ + +
+
+ +
+ +
+
+

+ + + +Wird geladen... + +

+ +
+
+ + +
+
+ Die Bewertungsfunktion ist nach Ausleihen des Videos verfügbar. +
+ +
+ +
+
+ Diese Funktion ist gerade nicht verfügbar. Bitte versuche es später noch einmal. +
+
+ + +
+ + +
+ + +
Am 16.08.2015 veröffentlicht

She's incapable of controlling her limbs when her kitty is around. The obsession grows every day.

Ps. That's a sleep sack she's in. Not a starfish outfit. Although I wish I were cool enough to dress my daughter in a starfish outfit.

Jukin Media Verified (Original)
*For licensing / permission to use please contact licensing(at)jukinmediadotcom

+
    +
  • +

    + Kategorie +

    + +
  • + +
+
+
+ +
+ + +
+
+
+ + +
+ Kommentare sind für dieses Video deaktiviert. +
+ +
+ + + + +
+
+
+
+ +
+ + +
+
+
+ + + +
+
+ +
+ +
+
+
+Anzeige +
+
+
+
+ + +
+
+
+
+
+ + + +Wenn Autoplay aktiviert ist, wird die Wiedergabe automatisch mit einem der aktuellen Videovorschläge fortgesetzt. + + + +
+

+ Nächstes Video +

+ + +
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+ +
+ +
+
+ + +
+
+ + +
+ , um dieses Video zur Playlist "Später ansehen" hinzuzufügen. + +
+
+

+Hinzufügen +

+
+
+

+ + + + Playlists werden geladen... + +

+ +
+
+ + + + + + + \ No newline at end of file diff --git a/backend/src/jest/snapshots/embeds/pr960.html b/backend/src/jest/snapshots/embeds/pr960.html new file mode 100644 index 000000000..9b564f09a --- /dev/null +++ b/backend/src/jest/snapshots/embeds/pr960.html @@ -0,0 +1,10042 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Editor embeds merge in nitro embed by mattwr18 · Pull Request #960 · Human-Connection/Human-Connection + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Skip to content +
+ + + + + + + + + + +
+ +
+ + +
+ +
+ + + +
+
+
+ + + + + + + + + + + + + + + +
+
+ +
    + + + + + +
  • + +
    + +
    + + + Unwatch + + +
    + Notifications +
    +
    + + + + + + + +
    +
    +
    + +
    +
  • + +
  • +
    +
    + + +
    +
    + + +
    + +
  • + +
  • +
    + + Fork + +
    + +

    Fork Human-Connection

    +
    +
    + +
    +

    If this dialog fails to load, you can visit the fork page directly.

    +
    +
    +
    +
    + + +
  • +
+ +

+ + /Human-Connection + + + + + + + + + +
+
+ + Select a Repo + + shift + + + z + + +
+
+
+
+ +
+
+ + +
+ Switch repository + + + + +
+ + +
+
+ +
+
+ + + +
+ Loading your repositories... +
+ + +
+
+
/Nitro +
+ + +

+ +
+ + + + +
+
+
+ + + +
+ + + + +
+ + +
+ +
+
+
+ + +
+ +

+ + Editor embeds merge in nitro embed + + #960 +

+
+ +
+
+ + + +
+
+
+ + + Open + + + +
+
+ + + wants to merge + 55 + commits into + + + + + +
+
+ + base: + master + + + + + + +
+
+ +
+ +from + + + + + +
+
+ + + +
+
+ + + + + + + +

Conversation

+
+ +
+ +
Pipelines
+ + + + + + + + +
+
+ +
+ + + + Projects + + +
+
+ Projects + +
+ +
+ +
+
+ +
+
+
+ + + + None yet + + +
+ +
Not inside a Release
+ + + +
+
+ +
+ 4 participants +
+ +
+
+ + + +
+
+ + + Lock conversation + + +
+
+ +

+ Lock conversation on this pull request +

+
+
+
    +
  • Other users can’t add new comments to this pull request.
  • +
  • + You and other members of teams with + write access + to this repository can still leave comments that others can see. +
  • +
  • You can always unlock this pull request again in the future.
  • +
+ +
+
+ +
+
+ +

+ Optionally, choose a reason for locking that others can see. Learn more about when + it’s appropriate to lock conversations. +

+
+
+
+ +
+
+
+ + + + + + +
+ +
+ +
+
+ + +
+ Move issue to another repository + + + + + +
+ + + + +
+
+ +
+
+ + +
+
+ Loading your repositories... +
+
+
+
+
+
+ + + +
+
+ + +
+ +
+
+ + +
+ + + +
+ @mattwr18 + +
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+

+ Pick your reaction +

+ + + +
+ + + + + + + + + + +
+
+ +
+ + + + +
+ + + + + + Copy link + + + + + + + + + + + + Report abuse + + + +
+ +
+ + + + + Member + + + + + + +

+ + + + + commented + + + 18 days ago + + + + +

+
+ + +
+ + + + + + + + + +
+

cake Pullrequest

+ +

Issues

+ + +
+
+ + + + +
+
+ +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+ +
Editor embeds merge in nitro embed hasno dependencies
+ + + + +
+ + + + +
+ + +
+

+ + + + + appinteractive + and others + added some commits + + on Dec 27, 2018 + +

+
+
+ + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + cc06d53 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + +
+ + Create README.md + + + +
+ +
+ + + +
+ +
+
+ +
+ + 3b49e9f + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + 18bfc85 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + f44121b + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + 32fad61 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + f8f0ff3 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + 8e71c27 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + +
+ + Improved readme + + + +
+ +
+ + + +
+ +
+
+ +
+ + 053cc86 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + 9ddf89d + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + +
+ + Upgraded screenshot + + + +
+ +
+ + + +
+ +
+
+ +
+ + c310644 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + 296fc5a + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-bot +
+
+ + + +
+ + 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](sindresorhus/got@v9.5.0...v9.6.0)
+
+Signed-off-by: dependabot[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 6461a43 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-bot +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v4.10.3)
+
+Signed-off-by: dependabot[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + f228eb3 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @appinteractive +
+
+ + + +
+ + Update README.md + + + +
+ +
+ + + +
+ +
+
+ +
+ + d3624ab + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 2a81c5b + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #7 from Human-Connection/dependabot/npm_and_yarn/g… + + + + + +
…ot-9.6.0
+
+Bump got from 9.5.0 to 9.6.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + 2e66ee4 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #17 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-4.10.3
+
+Bump metascraper from 4.8.5 to 4.10.3
+ +
+ +
+ + + +
+ +
+
+ +
+ + b7e7f22 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 4ceff96 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 69b1a25 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + b7ef87e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 82dcc99 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + + + +
+ + + +
+ +
+
+ +
+ + af8ed1c + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + d1efdad + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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](microlinkhq/metascraper@v4.8.5...v5.5.0)
+
+Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + b8725f1 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge branch 'master' of github.com:Human-Connection/Nitro-Embed into… + + + + + +
… dependabot/npm_and_yarn/metascraper-description-5.5.0
+ +
+ +
+ + +
+ +
+
+ +
+ + 05db6fe + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge branch 'dependabot/npm_and_yarn/metascraper-description-5.5.0' … + + + + + +
…of github.com:Human-Connection/Nitro-Embed into dependabot/npm_and_yarn/metascraper-description-5.5.0
+ +
+ +
+ + +
+ +
+
+ +
+ + bc9c21c + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #67 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-description-5.5.0
+
+Bump metascraper-description from 4.8.5 to 5.5.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + d633331 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #25 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-clearbit-logo-5.3.0
+
+Bump metascraper-clearbit-logo from 4.8.5 to 5.3.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + acfc956 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #69 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-logo-5.5.0
+
+Bump metascraper-logo from 4.8.5 to 5.5.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + a22edd9 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #71 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-audio-5.5.0
+
+Bump metascraper-audio from 4.8.5 to 5.5.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + 0e89f27 + +
+
+ + +
+
+
+ + +
+ + + + + +
+ + +
+

+ + + + + mattwr18 + and others + added some commits + + 19 days ago + +

+
+
+ + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #72 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-video-5.5.0
+
+Bump metascraper-video from 4.8.5 to 5.5.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + 46edb24 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @dependabot-preview +
+
+ + + +
+ + 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] <support@dependabot.com>
+ +
+ +
+ + + +
+ +
+
+ +
+ + 721c75e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge branch 'master' of github.com:Human-Connection/Nitro-Embed into… + + + + + +
… dependabot/npm_and_yarn/metascraper-url-5.5.0
+ +
+ +
+ + +
+ +
+
+ +
+ + 93e82de + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #73 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-url-5.5.0
+
+Bump metascraper-url from 4.8.5 to 5.5.0
+ +
+ +
+ + + +
+ +
+
+ +
+ + 27eb5a2 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #75 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…apollo-server-2.6.7
+
+Bump apollo-server from 2.3.1 to 2.6.7
+ +
+ +
+ + + +
+ +
+
+ +
+ + 638f1f3 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge pull request #76 from Human-Connection/dependabot/npm_and_yarn/… + + + + + +
…metascraper-soundcloud-5.5.3
+
+Bump metascraper-soundcloud from 4.8.5 to 5.5.3
+ +
+ +
+ + + +
+ +
+
+ +
+ + 5091fe5 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + 089b07c + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + cc6819e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + 7a3694a + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + +
+ + Merge in Nitro-Embed + + + +
+ +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + eabb58e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @mattwr18 +
+
+ + + + + +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + ed658e9 + +
+
+ + +
+
+
+ + +
+ + + +
+ + +
+ + + +
+ @codecov + +
+ + + +
+
+ + + + +
+ +
+

+ This comment has been minimized. + +

+
Show comment
+
Hide comment
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + Copy link + + + + + + + + +
+ + +
+
+ + +
+ + + + Report abuse + +
+ Block user + + + +
+ + + +
+
+ +
+ @codecov +
+

+ + + + codecov + bot + + + + 18 days ago + +

+ + + + +
+

Codecov Report

+
+

exclamation No coverage uploaded for pull request base (master@324330a). Click here to learn what that means.
+The diff coverage is n/a.

+
+
+
+
+
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+

+ Pick your reaction +

+ + + +
+ + + + + + + + + + +
+
+ +
+ + + + +
+ + + + + + Copy link + + + + + + +
+ + + Reference in new issue + + +
+ +

Reference in new issue

+
+ +
+ +
+
+
+
+
+ + + Human-Connection + + +
+ Repositories +
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+ + + + + + + +
+ + +
+ + + + Report abuse + +
+ Block user + + + +
+ + + +
+
+ +
+ + + + + + + + +

+ + + + + commented + + + 18 days ago + + + + +

+
+ + +
+
+ + +
+ +

Choose a reason for hiding this comment

+

The reason will be displayed to describe this comment to others. Learn more.

+
+ + + +
+ +
+ + + + + + + + + +
+

Codecov Report

+
+

exclamation No coverage uploaded for pull request base (master@324330a). Click here to learn what that means.
+The diff coverage is n/a.

+
+
+
+ + + + +
+
+ +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+ + +
+ + +
+ + + + +
+ +
+

+ + + + @mattwr18 + mattwr18 + + + referenced this pull request + + 16 days ago + +

+ + + + + Closed + + + + + + +

+ + Editor embeds + #953 +

+ + + + + + + +
+ + + +
+ + + +
+ + +
+ + + +
+ @mattwr18 + +
+ + + +
+
+ + + + +
+ +
+

+ This comment has been minimized. + +

+
Show comment
+
Hide comment
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + Copy link + + + + + + + + +
+ + +
+
+ + +
+ + + + Report abuse + + +
+
+ +
+ @mattwr18 +
+

+ + + + mattwr18 + + + + + 9 days ago + +

+ + + Member + + + + Author + + + +
+

does this look ok @roschaefer? I used tomono, but because I already had a repo with the name Human-Connection, I needed to remove it and recreate it with the merged commit history. This caused some small issues for me locally, but I think others won't face the same.

+

The files changed and commit history look good to me

+
+
+
+
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+

+ Pick your reaction +

+ + + +
+ + + + + + + + + + +
+
+ +
+ + + + +
+ + + + + + Copy link + + + + + + +
+ + + Reference in new issue + + +
+ +

Reference in new issue

+
+ +
+ +
+
+
+
+
+ + + Human-Connection + + +
+ Repositories +
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+ + + + + + + +
+ + +
+ + + + Report abuse + + +
+
+ +
+ + + + + Member + + + + + Author + + + + +

+ + + + + commented + + + 9 days ago + + + + +

+
+ + +
+
+ + +
+ +

Choose a reason for hiding this comment

+

The reason will be displayed to describe this comment to others. Learn more.

+
+ + + +
+ +
+ + + + + + + + + +
+

does this look ok @roschaefer? I used tomono, but because I already had a repo with the name Human-Connection, I needed to remove it and recreate it with the merged commit history. This caused some small issues for me locally, but I think others won't face the same.

+

The files changed and commit history look good to me

+
+
+ + + + +
+
+ +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+ + +
+ + +
+ + + + +
+ + +
+
+
+ + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Merge remote-tracking branch 'origin/master' into 256-editor-embeds-m… + + + + + +
…erge-in-nitro-embed
+ +
+ +
+ + +
+ +
+
+ +
+ + b745908 + +
+
+ + +
+
+
+ + +
+ + + +
+ + +
+ + + +
+ @roschaefer + +
+ + + +
+
+ + + + +
+ +
+

+ This comment has been minimized. + +

+
Show comment
+
Hide comment
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + Copy link + + + + + + + + +
+ + +
+
+ + +
+ +
+
+ +
+ @roschaefer +
+

+ + + + roschaefer + + + + + 5 days ago + +

+ + + Member + + + + +
+

@mattwr18 this looks good, but could sb. explain me why this is a separate service and not just another resolver in our backend?

+

@appinteractive maybe?

+
+
+
+
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+

+ Pick your reaction +

+ + + +
+ + + + + + + + + + +
+
+ +
+ + + + +
+ + + + + + Copy link + + + + + + +
+ + + Reference in new issue + + +
+ +

Reference in new issue

+
+ +
+ +
+
+
+
+
+ + + Human-Connection + + +
+ Repositories +
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+ + + + + + + +
+ + +
+ +
+
+ +
+ + + + + Member + + + + + + +

+ + + + + commented + + + 5 days ago + + + + +

+
+ + +
+
+ + +
+ +

Choose a reason for hiding this comment

+

The reason will be displayed to describe this comment to others. Learn more.

+
+ + + +
+ +
+ + + + + + + + + +
+

@mattwr18 this looks good, but could sb. explain me why this is a separate service and not just another resolver in our backend?

+

@appinteractive maybe?

+
+
+ + + + +
+
+ +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+ + +
+ + +
+ + + + +
+ + +
+ + + +
+ @mattwr18 + +
+ + + +
+
+ + + + +
+ +
+

+ This comment has been minimized. + +

+
Show comment
+
Hide comment
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + + Copy link + + + + + + + + +
+ + +
+
+ + +
+ + + + Report abuse + + +
+
+ +
+ @mattwr18 +
+

+ + + + mattwr18 + + + + + 5 days ago + +

+ + + Member + + + + Author + + + +
+

I think it could be, I thought the same thing myself @roschaefer

+
+
+
+
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + +
+

+ Pick your reaction +

+ + + +
+ + + + + + + + + + +
+
+ +
+ + + + +
+ + + + + + Copy link + + + + + + +
+ + + Reference in new issue + + +
+ +

Reference in new issue

+
+ +
+ +
+
+
+
+
+ + + Human-Connection + + +
+ Repositories +
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+ + + + + + + +
+ + +
+ + + + Report abuse + + +
+
+ +
+ + + + + Member + + + + + Author + + + + +

+ + + + + commented + + + 5 days ago + + + + +

+
+ + +
+
+ + +
+ +

Choose a reason for hiding this comment

+

The reason will be displayed to describe this comment to others. Learn more.

+
+ + + +
+ +
+ + + + + + + + + +
+

I think it could be, I thought the same thing myself @roschaefer

+
+
+ + + + +
+
+ +
+ +
+
+ +
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + +

+ The content you are editing has changed. Please try again. +

+ + +
+ + + + + + + + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+ + +
+
+
+

Nothing to preview

+
+
+ +
+ +
+ + + + +
+ + +
+
+ + +
+ +
+
+ + +
+ + +
+ + + + +
+ + +
+

+ + + + + roschaefer + + added some commits + + 2 days ago + +

+
+
+ + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Merge remote-tracking branch 'origin/master' into 256-editor-embeds-m… + + + + + +
…erge-in-nitro-embed
+ +
+ +
+ + +
+ +
+
+ +
+ + b3712d9 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + d4c3b7a + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + 2e6ea62 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + f82b2c3 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + 17ccbce + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Fix lint + + + +
+ +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + 73e879e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Merge branch 'master' of github.com:Human-Connection/Human-Connection… + + + + + +
… into 256-editor-embeds-merge-in-nitro-embed
+ +
+ +
+ + +
+ +
+
+ +
+ + 7a9d933 + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Remove obscure `embed` attribute and remove cache + + + + + +
The cache is a possible memory leak: It grows over time and never gets
+cleaned.
+ +
+ +
+ + +
+ +
+
+ +
+ + d81c38c + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Start to mock+test embeds resolver + + + + + +
+ Put oembed providers into a file
++ Add test snapshots
++ Remove unnecessary request-native dependency
+ +
+ +
+ + +
+ +
+
+ +
+ + f5730fc + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+
+ +
+ + 579ec7e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Add npm script to run tests without http servers + + + + + +
Remove this script once we refactored all tests to use
+`apollo-server-testing`.
+ +
+ +
+ + +
+ +
+
+ +
+ + d7d2c2e + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + + + +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + 75743ca + +
+
+ + + + +
+ +
+ +
+ + +
+
+ + @roschaefer +
+
+ + + +
+ + Remove `metascraper-logo-favicon` altogether + + + + + +
It's doing http requests which are hard to test and hard to maintain.
+Therefore let's remove it until we really need it.
+ +
+ +
+ + +
+ +
+ +
+ + + + +
+ + +
+ +
+ + 3d7a30d + +
+
+ + +
+
+
+ + +
+ + + + + +
+
+ +
+ + +
+ +
+ + + +
+ +

Merge state

+
+

Add more commits by pushing to the 256-editor-embeds-merge-in-nitro-embed branch on Human-Connection/Human-Connection.

+ + + + + + +
+ + + +
+
+ +
+
+ +
+ + + Add your review + + +

+ Review required +

+ + + At least 1 approving review is required by reviewers with write access. + Learn more. + + + +
+ + +
+
+ +
+ +
+ + +

All checks have passed

+ 4 successful checks +
+ +
+
+
+ +
+ + + @travis-ci + + + +
+ + Travis CI - Branch + + + Successful in 18m + + — + Build Passed +
+ +
+ Required + + Details +
+ +
+
+
+ +
+ + + @travis-ci + + + +
+ + Travis CI - Pull Request + + + Successful in 17m + + — + Build Passed +
+ +
+ Required + + Details +
+ +
+
+
+ +
+ + + @codecov + + + +
+ + codecov/project/backend + + + + + — + 25.29% (+1.97%) compared to d901432 +
+ +
+ + Details +
+ +
+
+
+ +
+ + + @codecov + + + +
+ + codecov/project/webapp + + + + + — + 45.23% remains the same compared to d901432 +
+ +
+ + Details +
+ +
+ +
+
+ + +
+
+ +
+
Merging is blocked
+ Merging can be performed automatically with 1 approving review. +
+ + + +
+ + +
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ +
+
+
+ + +

+ + + + or view . +

+ + +
+

Merging via command line

+

+ If you do not want to use the merge button or an automatic merge cannot be + performed, you can perform a manual merge on the command line. +

+ +
+
+
+ +
+ +
+ + + + + + + + +
+
+ +

Step 1: From your project repository, bring in the changes and test.

+
+
+ + + +
+
git fetch origin
+git checkout -b 256-editor-embeds-merge-in-nitro-embed origin/256-editor-embeds-merge-in-nitro-embed
+git merge master
+
+ +

Step 2: Merge the changes and update on GitHub.

+
+
+ + + +
+
git checkout master
+git merge --no-ff 256-editor-embeds-merge-in-nitro-embed
+git push origin master
+
+
+ +
+
+
+
+ + + + +
+ + + + + +
+ + + +
+ +

Couldn’t update branch

+

Oops, something went wrong.

+ +
+
+ +

Connect this pull request with an existing issue

+ +
+ @roschaefer + +
+ + + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ Select a reply + ctrl . +
+ + + +
+
+ +
+ +
+ +
+ + + + + +
+ + + + + + + +

+ + + + + Attach files by dragging & dropping, selecting or pasting them. + + + Uploading your files… + + + We don’t support that file type. + + with a + GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Attaching documents requires write permission to this repository. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + We don’t support that file type. + + with a GIF, JPEG, JPG, PNG, DOCX, GZ, LOG, PDF, PPTX, TXT, XLSX or ZIP. + + + + Yowza, that’s a big file + + with a file smaller than 10MB. + + + + This file is empty. + + with a file that’s not empty. + + + + This file is hidden. + + with another file. + + + + Something went really wrong, and we can’t process that file. + + + + + + + + + + +

+ +
+
+
+ + + +
+
+

Nothing to preview

+
+
+ +
+ + + + +
+ +
+
+ + + + + + +
+ +
+
+
+
+ + ProTip! + Add .patch or .diff to the end of URLs for Git’s plaintext views. +
+
+ + +
+
+ +
+
+ + + +
+ + +
+ +
+ +
+
+ + +
+ + + + + + +
+ + + You can’t perform that action at this time. +
+ + + + + + + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/backend/src/middleware/email/templates/signup.js b/backend/src/middleware/email/templates/signup.js index 1a9c0de91..7751f0e67 100644 --- a/backend/src/middleware/email/templates/signup.js +++ b/backend/src/middleware/email/templates/signup.js @@ -11,6 +11,7 @@ export const signupTemplate = options => { } = options const actionUrl = new URL('/registration/create-user-account', CONFIG.CLIENT_URI) actionUrl.searchParams.set('nonce', nonce) + actionUrl.searchParams.set('email', email) return { to: email, diff --git a/backend/src/middleware/handleHtmlContent/handleContentData.spec.js b/backend/src/middleware/handleHtmlContent/handleContentData.spec.js index aa281e6d7..f2e3c2303 100644 --- a/backend/src/middleware/handleHtmlContent/handleContentData.spec.js +++ b/backend/src/middleware/handleHtmlContent/handleContentData.spec.js @@ -1,6 +1,5 @@ import { GraphQLClient } from 'graphql-request' -import gql from 'graphql-tag' -import { host, login } from '../../jest/helpers' +import { host, login, gql } from '../../jest/helpers' import Factory from '../../seed/factories' const factory = Factory() diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index fd631256d..ba5b9d324 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -1,4 +1,6 @@ +import { applyMiddleware } from 'graphql-middleware' import CONFIG from './../config' + import activityPub from './activityPubMiddleware' import softDelete from './softDeleteMiddleware' import sluggify from './sluggifyMiddleware' @@ -50,11 +52,14 @@ export default schema => { if (CONFIG.DISABLED_MIDDLEWARES) { const disabledMiddlewares = CONFIG.DISABLED_MIDDLEWARES.split(',') order = order.filter(key => { + if (disabledMiddlewares.includes(key)) { + /* eslint-disable-next-line no-console */ + console.log(`Warning: Disabled "${disabledMiddlewares}" middleware.`) + } return !disabledMiddlewares.includes(key) }) - /* eslint-disable-next-line no-console */ - console.log(`Warning: "${disabledMiddlewares}" middlewares have been disabled.`) } - return order.map(key => middlewares[key]) + const appliedMiddlewares = order.map(key => middlewares[key]) + return applyMiddleware(schema, ...appliedMiddlewares) } diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index a6b6ef0da..d24bbcc9f 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -136,6 +136,7 @@ const permissions = shield( Query: { '*': deny, findPosts: allow, + embed: allow, Category: allow, Tag: allow, Report: isModerator, @@ -146,6 +147,7 @@ const permissions = shield( Comment: allow, User: or(noEmailFilter, isAdmin), isLoggedIn: allow, + Badge: allow, }, Mutation: { '*': deny, @@ -160,9 +162,6 @@ const permissions = shield( UpdatePost: isAuthor, DeletePost: isAuthor, report: isAuthenticated, - CreateBadge: isAdmin, - UpdateBadge: isAdmin, - DeleteBadge: isAdmin, CreateSocialMedia: isAuthenticated, DeleteSocialMedia: isAuthenticated, // AddBadgeRewarded: isAdmin, @@ -178,6 +177,7 @@ const permissions = shield( enable: isModerator, disable: isModerator, CreateComment: isAuthenticated, + UpdateComment: isAuthor, DeleteComment: isAuthor, DeleteUser: isDeletingOwnAccount, requestPasswordReset: allow, diff --git a/backend/src/middleware/validation/index.js b/backend/src/middleware/validation/index.js deleted file mode 100644 index ca7a6b338..000000000 --- a/backend/src/middleware/validation/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import { UserInputError } from 'apollo-server' - -const validateUrl = async (resolve, root, args, context, info) => { - const { url } = args - const isValid = url.match(/^(?:https?:\/\/)(?:[^@\n])?(?:www\.)?([^:/\n?]+)/g) - if (isValid) { - /* eslint-disable-next-line no-return-await */ - return await resolve(root, args, context, info) - } else { - throw new UserInputError('Input is not a URL') - } -} - -export default { - Mutation: { - CreateSocialMedia: validateUrl, - }, -} diff --git a/backend/src/middleware/validation/validationMiddleware.js b/backend/src/middleware/validation/validationMiddleware.js index 9ac15a60f..319a9a6c0 100644 --- a/backend/src/middleware/validation/validationMiddleware.js +++ b/backend/src/middleware/validation/validationMiddleware.js @@ -1,6 +1,9 @@ import { UserInputError } from 'apollo-server' import Joi from '@hapi/joi' +const COMMENT_MIN_LENGTH = 1 +const NO_POST_ERR_MESSAGE = 'Comment cannot be created without a post!' + const validate = schema => { return async (resolve, root, args, context, info) => { const validation = schema.validate(args) @@ -15,8 +18,47 @@ const socialMediaSchema = Joi.object().keys({ .required(), }) +const validateCommentCreation = async (resolve, root, args, context, info) => { + const content = args.content.replace(/<(?:.|\n)*?>/gm, '').trim() + const { postId } = args + + if (!args.content || content.length < COMMENT_MIN_LENGTH) { + throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`) + } + const session = context.driver.session() + const postQueryRes = await session.run( + ` + MATCH (post:Post {id: $postId}) + RETURN post`, + { + postId, + }, + ) + const [post] = postQueryRes.records.map(record => { + return record.get('post') + }) + + if (!post) { + throw new UserInputError(NO_POST_ERR_MESSAGE) + } else { + return resolve(root, args, context, info) + } +} + +const validateUpdateComment = async (resolve, root, args, context, info) => { + const COMMENT_MIN_LENGTH = 1 + const content = args.content.replace(/<(?:.|\n)*?>/gm, '').trim() + if (!args.content || content.length < COMMENT_MIN_LENGTH) { + throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`) + } + + return resolve(root, args, context, info) +} + export default { Mutation: { CreateSocialMedia: validate(socialMediaSchema), + CreateComment: validateCommentCreation, + UpdateComment: validateUpdateComment, }, } diff --git a/backend/src/models/Badge.js b/backend/src/models/Badge.js new file mode 100644 index 000000000..6968a056b --- /dev/null +++ b/backend/src/models/Badge.js @@ -0,0 +1,7 @@ +module.exports = { + id: { type: 'string', primary: true, lowercase: true }, + status: { type: 'string', valid: ['permanent', 'temporary'] }, + type: { type: 'string', valid: ['role', 'crowdfunding'] }, + icon: { type: 'string', required: true }, + createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, +} diff --git a/backend/src/models/EmailAddress.js b/backend/src/models/EmailAddress.js index ddd56c297..6afccd1ed 100644 --- a/backend/src/models/EmailAddress.js +++ b/backend/src/models/EmailAddress.js @@ -8,5 +8,6 @@ module.exports = { relationship: 'BELONGS_TO', target: 'User', direction: 'out', + eager: true, }, } diff --git a/backend/src/models/User.js b/backend/src/models/User.js index d8f768ae9..cac8fd7a6 100644 --- a/backend/src/models/User.js +++ b/backend/src/models/User.js @@ -4,7 +4,6 @@ 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] }, @@ -43,6 +42,12 @@ module.exports = { target: 'User', direction: 'in', }, + rewarded: { + type: 'relationship', + relationship: 'REWARDED', + target: 'Badge', + direction: 'in', + }, invitedBy: { type: 'relationship', relationship: 'INVITED', target: 'User', direction: 'in' }, createdAt: { type: 'string', isoDate: true, default: () => new Date().toISOString() }, updatedAt: { diff --git a/backend/src/models/index.js b/backend/src/models/index.js index 0e6ae5864..09d1dbbeb 100644 --- a/backend/src/models/index.js +++ b/backend/src/models/index.js @@ -1,6 +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 { + Badge: require('./Badge.js'), User: require('./User.js'), InvitationCode: require('./InvitationCode.js'), EmailAddress: require('./EmailAddress.js'), diff --git a/backend/src/schema/helpers.js b/backend/src/schema/helpers.js new file mode 100644 index 000000000..fe61ccf57 --- /dev/null +++ b/backend/src/schema/helpers.js @@ -0,0 +1,9 @@ +export 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 +} diff --git a/backend/src/schema/index.js b/backend/src/schema/index.js index 8fbb5cfda..0f724d9b5 100644 --- a/backend/src/schema/index.js +++ b/backend/src/schema/index.js @@ -12,11 +12,25 @@ export default applyScalars( resolvers, config: { query: { - exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'], + exclude: [ + 'Badge', + 'InvitationCode', + 'EmailAddress', + 'Notfication', + 'Statistics', + 'LoggedInUser', + ], // add 'User' here as soon as possible }, mutation: { - exclude: ['InvitationCode', 'EmailAddress', 'Notfication', 'Statistics', 'LoggedInUser'], + exclude: [ + 'Badge', + 'InvitationCode', + 'EmailAddress', + 'Notfication', + 'Statistics', + 'LoggedInUser', + ], // add 'User' here as soon as possible }, debug: CONFIG.DEBUG, diff --git a/backend/src/schema/resolvers/badges.js b/backend/src/schema/resolvers/badges.js new file mode 100644 index 000000000..19bc24fd6 --- /dev/null +++ b/backend/src/schema/resolvers/badges.js @@ -0,0 +1,9 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' + +export default { + Query: { + Badge: async (object, args, context, resolveInfo) => { + return neo4jgraphql(object, args, context, resolveInfo, false) + }, + }, +} diff --git a/backend/src/schema/resolvers/badges.spec.js b/backend/src/schema/resolvers/badges.spec.js deleted file mode 100644 index a0dbafe00..000000000 --- a/backend/src/schema/resolvers/badges.spec.js +++ /dev/null @@ -1,200 +0,0 @@ -import { GraphQLClient } from 'graphql-request' -import Factory from '../../seed/factories' -import { host, login } from '../../jest/helpers' - -const factory = Factory() -let client - -describe('badges', () => { - beforeEach(async () => { - await factory.create('User', { - email: 'user@example.org', - role: 'user', - password: '1234', - }) - await factory.create('User', { - id: 'u2', - role: 'moderator', - email: 'moderator@example.org', - }) - await factory.create('User', { - id: 'u3', - role: 'admin', - email: 'admin@example.org', - }) - }) - - afterEach(async () => { - await factory.cleanDatabase() - }) - - describe('CreateBadge', () => { - const variables = { - id: 'b1', - key: 'indiegogo_en_racoon', - type: 'crowdfunding', - status: 'permanent', - icon: '/img/badges/indiegogo_en_racoon.svg', - } - - const mutation = ` - mutation( - $id: ID - $key: String! - $type: BadgeType! - $status: BadgeStatus! - $icon: String! - ) { - CreateBadge(id: $id, key: $key, type: $type, status: $status, icon: $icon) { - id, - key, - type, - status, - icon - } - } - ` - - describe('unauthenticated', () => { - it('throws authorization error', async () => { - client = new GraphQLClient(host) - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated admin', () => { - beforeEach(async () => { - const headers = await login({ email: 'admin@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - it('creates a badge', async () => { - const expected = { - CreateBadge: { - icon: '/img/badges/indiegogo_en_racoon.svg', - id: 'b1', - key: 'indiegogo_en_racoon', - status: 'permanent', - type: 'crowdfunding', - }, - } - await expect(client.request(mutation, variables)).resolves.toEqual(expected) - }) - }) - - describe('authenticated moderator', () => { - beforeEach(async () => { - const headers = await login({ email: 'moderator@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - - it('throws authorization error', async () => { - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - }) - - describe('UpdateBadge', () => { - beforeEach(async () => { - await factory.authenticateAs({ email: 'admin@example.org', password: '1234' }) - await factory.create('Badge', { id: 'b1' }) - }) - const variables = { - id: 'b1', - key: 'whatever', - } - - const mutation = ` - mutation($id: ID!, $key: String!) { - UpdateBadge(id: $id, key: $key) { - id - key - } - } - ` - - describe('unauthenticated', () => { - it('throws authorization error', async () => { - client = new GraphQLClient(host) - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated moderator', () => { - beforeEach(async () => { - const headers = await login({ email: 'moderator@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - - it('throws authorization error', async () => { - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated admin', () => { - beforeEach(async () => { - const headers = await login({ email: 'admin@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - it('updates a badge', async () => { - const expected = { - UpdateBadge: { - id: 'b1', - key: 'whatever', - }, - } - await expect(client.request(mutation, variables)).resolves.toEqual(expected) - }) - }) - }) - - describe('DeleteBadge', () => { - beforeEach(async () => { - await factory.authenticateAs({ email: 'admin@example.org', password: '1234' }) - await factory.create('Badge', { id: 'b1' }) - }) - const variables = { - id: 'b1', - } - - const mutation = ` - mutation($id: ID!) { - DeleteBadge(id: $id) { - id - } - } - ` - - describe('unauthenticated', () => { - it('throws authorization error', async () => { - client = new GraphQLClient(host) - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated moderator', () => { - beforeEach(async () => { - const headers = await login({ email: 'moderator@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - - it('throws authorization error', async () => { - await expect(client.request(mutation, variables)).rejects.toThrow('Not Authorised') - }) - }) - - describe('authenticated admin', () => { - beforeEach(async () => { - const headers = await login({ email: 'admin@example.org', password: '1234' }) - client = new GraphQLClient(host, { headers }) - }) - it('deletes a badge', async () => { - const expected = { - DeleteBadge: { - id: 'b1', - }, - } - await expect(client.request(mutation, variables)).resolves.toEqual(expected) - }) - }) - }) -}) diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js index 7aef63c59..31219d6d9 100644 --- a/backend/src/schema/resolvers/comments.js +++ b/backend/src/schema/resolvers/comments.js @@ -1,40 +1,15 @@ import { neo4jgraphql } from 'neo4j-graphql-js' -import { UserInputError } from 'apollo-server' - -const COMMENT_MIN_LENGTH = 1 -const NO_POST_ERR_MESSAGE = 'Comment cannot be created without a post!' export default { Mutation: { CreateComment: async (object, params, context, resolveInfo) => { - const content = params.content.replace(/<(?:.|\n)*?>/gm, '').trim() const { postId } = params // Adding relationship from comment to post by passing in the postId, // but we do not want to create the comment with postId as an attribute // because we use relationships for this. So, we are deleting it from params // before comment creation. delete params.postId - - if (!params.content || content.length < COMMENT_MIN_LENGTH) { - throw new UserInputError(`Comment must be at least ${COMMENT_MIN_LENGTH} character long!`) - } - const session = context.driver.session() - const postQueryRes = await session.run( - ` - MATCH (post:Post {id: $postId}) - RETURN post`, - { - postId, - }, - ) - const [post] = postQueryRes.records.map(record => { - return record.get('post') - }) - - if (!post) { - throw new UserInputError(NO_POST_ERR_MESSAGE) - } const commentWithoutRelationships = await neo4jgraphql( object, params, diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js index 7f17539dc..890ba5feb 100644 --- a/backend/src/schema/resolvers/comments.spec.js +++ b/backend/src/schema/resolvers/comments.spec.js @@ -1,7 +1,6 @@ -import gql from 'graphql-tag' import { GraphQLClient } from 'graphql-request' import Factory from '../../seed/factories' -import { host, login } from '../../jest/helpers' +import { host, login, gql } from '../../jest/helpers' const factory = Factory() let client @@ -10,7 +9,28 @@ let createPostVariables let createCommentVariablesSansPostId let createCommentVariablesWithNonExistentPost let userParams -let authorParams +let headers + +const createPostMutation = gql` + mutation($id: ID!, $title: String!, $content: String!) { + CreatePost(id: $id, title: $title, content: $content) { + id + } + } +` +const createCommentMutation = gql` + mutation($id: ID, $postId: ID!, $content: String!) { + CreateComment(id: $id, postId: $postId, content: $content) { + id + content + } + } +` +createPostVariables = { + id: 'p1', + title: 'post to comment on', + content: 'please comment on me', +} beforeEach(async () => { userParams = { @@ -26,21 +46,6 @@ afterEach(async () => { }) describe('CreateComment', () => { - const createCommentMutation = gql` - mutation($postId: ID!, $content: String!) { - CreateComment(postId: $postId, content: $content) { - id - content - } - } - ` - const createPostMutation = gql` - mutation($id: ID!, $title: String!, $content: String!) { - CreatePost(id: $id, title: $title, content: $content) { - id - } - } - ` describe('unauthenticated', () => { it('throws authorization error', async () => { createCommentVariables = { @@ -55,7 +60,6 @@ describe('CreateComment', () => { }) describe('authenticated', () => { - let headers beforeEach(async () => { headers = await login(userParams) client = new GraphQLClient(host, { @@ -65,11 +69,6 @@ describe('CreateComment', () => { postId: 'p1', content: "I'm authorised to comment", } - createPostVariables = { - id: 'p1', - title: 'post to comment on', - content: 'please comment on me', - } await client.request(createPostMutation, createPostVariables) }) @@ -188,19 +187,8 @@ describe('CreateComment', () => { }) }) -describe('DeleteComment', () => { - const deleteCommentMutation = gql` - mutation($id: ID!) { - DeleteComment(id: $id) { - id - } - } - ` - - let deleteCommentVariables = { - id: 'c1', - } - +describe('ManageComments', () => { + let authorParams beforeEach(async () => { authorParams = { email: 'author@example.org', @@ -214,51 +202,178 @@ describe('DeleteComment', () => { content: 'Post to be commented', }) await asAuthor.create('Comment', { - id: 'c1', + id: 'c456', postId: 'p1', content: 'Comment to be deleted', }) }) - describe('unauthenticated', () => { - it('throws authorization error', async () => { - client = new GraphQLClient(host) - await expect(client.request(deleteCommentMutation, deleteCommentVariables)).rejects.toThrow( - 'Not Authorised', - ) - }) - }) - - describe('authenticated but not the author', () => { - beforeEach(async () => { - let headers - headers = await login(userParams) - client = new GraphQLClient(host, { headers }) - }) - - it('throws authorization error', async () => { - await expect(client.request(deleteCommentMutation, deleteCommentVariables)).rejects.toThrow( - 'Not Authorised', - ) - }) - }) - - describe('authenticated as author', () => { - beforeEach(async () => { - let headers - headers = await login(authorParams) - client = new GraphQLClient(host, { headers }) - }) - - it('deletes the comment', async () => { - const expected = { - DeleteComment: { - id: 'c1', - }, + describe('UpdateComment', () => { + const updateCommentMutation = gql` + mutation($content: String!, $id: ID!) { + UpdateComment(content: $content, id: $id) { + id + content + } } - await expect(client.request(deleteCommentMutation, deleteCommentVariables)).resolves.toEqual( - expected, - ) + ` + + let updateCommentVariables = { + id: 'c456', + content: 'The comment is updated', + } + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + client = new GraphQLClient(host) + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Not Authorised', + ) + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + headers = await login({ + email: 'test@example.org', + password: '1234', + }) + client = new GraphQLClient(host, { + headers, + }) + }) + + it('throws authorization error', async () => { + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Not Authorised', + ) + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + headers = await login(authorParams) + client = new GraphQLClient(host, { + headers, + }) + }) + + it('updates the comment', async () => { + const expected = { + UpdateComment: { + id: 'c456', + content: 'The comment is updated', + }, + } + await expect( + client.request(updateCommentMutation, updateCommentVariables), + ).resolves.toEqual(expected) + }) + + it('throw an error if an empty string is sent from the editor as content', async () => { + updateCommentVariables = { + id: 'c456', + content: '

', + } + + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Comment must be at least 1 character long!', + ) + }) + + it('throws an error if a comment sent from the editor does not contain a single letter character', async () => { + updateCommentVariables = { + id: 'c456', + content: '

', + } + + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Comment must be at least 1 character long!', + ) + }) + + it('throws an error if commentId is sent as an empty string', async () => { + updateCommentVariables = { + id: '', + content: '

Hello

', + } + + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Not Authorised!', + ) + }) + + it('throws an error if the comment does not exist in the database', async () => { + updateCommentVariables = { + id: 'c1000', + content: '

Hello

', + } + + await expect(client.request(updateCommentMutation, updateCommentVariables)).rejects.toThrow( + 'Not Authorised!', + ) + }) + }) + }) + + describe('DeleteComment', () => { + const deleteCommentMutation = gql` + mutation($id: ID!) { + DeleteComment(id: $id) { + id + } + } + ` + + let deleteCommentVariables = { + id: 'c456', + } + + describe('unauthenticated', () => { + it('throws authorization error', async () => { + client = new GraphQLClient(host) + await expect(client.request(deleteCommentMutation, deleteCommentVariables)).rejects.toThrow( + 'Not Authorised', + ) + }) + }) + + describe('authenticated but not the author', () => { + beforeEach(async () => { + headers = await login({ + email: 'test@example.org', + password: '1234', + }) + client = new GraphQLClient(host, { + headers, + }) + }) + + it('throws authorization error', async () => { + await expect(client.request(deleteCommentMutation, deleteCommentVariables)).rejects.toThrow( + 'Not Authorised', + ) + }) + }) + + describe('authenticated as author', () => { + beforeEach(async () => { + headers = await login(authorParams) + client = new GraphQLClient(host, { + headers, + }) + }) + + it('deletes the comment', async () => { + const expected = { + DeleteComment: { + id: 'c456', + }, + } + await expect( + client.request(deleteCommentMutation, deleteCommentVariables), + ).resolves.toEqual(expected) + }) }) }) }) diff --git a/backend/src/schema/resolvers/embeds.js b/backend/src/schema/resolvers/embeds.js new file mode 100644 index 000000000..ba27f77b2 --- /dev/null +++ b/backend/src/schema/resolvers/embeds.js @@ -0,0 +1,29 @@ +import scrape from './embeds/scraper.js' +import { undefinedToNull } from '../helpers' + +export default { + Query: { + embed: async (object, { url }, context, resolveInfo) => { + return scrape(url) + }, + }, + Embed: { + ...undefinedToNull([ + 'type', + 'title', + 'author', + 'publisher', + 'date', + 'description', + 'url', + 'image', + 'audio', + 'video', + 'lang', + 'html', + ]), + sources: async (parent, params, context, resolveInfo) => { + return typeof parent.sources === 'undefined' ? [] : parent.sources + }, + }, +} diff --git a/backend/src/schema/resolvers/embeds.spec.js b/backend/src/schema/resolvers/embeds.spec.js new file mode 100644 index 000000000..348fb50b0 --- /dev/null +++ b/backend/src/schema/resolvers/embeds.spec.js @@ -0,0 +1,216 @@ +import fetch from 'node-fetch' +import fs from 'fs' +import path from 'path' +import { createTestClient } from 'apollo-server-testing' +import createServer from '../../server' +import { gql } from '../../jest/helpers' + +jest.mock('node-fetch') +const { Response } = jest.requireActual('node-fetch') + +afterEach(() => { + fetch.mockRestore() +}) + +let variables = {} + +const HumanConnectionOrg = fs.readFileSync( + path.join(__dirname, '../../jest/snapshots/embeds/HumanConnectionOrg.html'), + 'utf8', +) +const pr960 = fs.readFileSync( + path.join(__dirname, '../../jest/snapshots/embeds/pr960.html'), + 'utf8', +) +const babyLovesCat = fs.readFileSync( + path.join(__dirname, '../../jest/snapshots/embeds/babyLovesCat.html'), + 'utf8', +) + +const babyLovesCatEmbedResponse = new Response( + JSON.stringify({ + height: 270, + provider_name: 'YouTube', + title: 'Baby Loves Cat', + type: 'video', + width: 480, + thumbnail_height: 360, + provider_url: 'https://www.youtube.com/', + thumbnail_width: 480, + html: + '', + thumbnail_url: 'https://i.ytimg.com/vi/qkdXAtO40Fo/hqdefault.jpg', + version: '1.0', + author_name: 'Merkley Family', + author_url: 'https://www.youtube.com/channel/UC5P8yei950tif7UmdPpkJLQ', + }), +) + +describe('Query', () => { + describe('embed', () => { + let embedAction + + beforeEach(() => { + embedAction = async variables => { + const { server } = createServer({ + context: () => {}, + }) + const { query } = createTestClient(server) + const embed = gql` + query($url: String!) { + embed(url: $url) { + type + title + author + publisher + date + description + url + image + audio + video + lang + sources + html + } + } + ` + return query({ query: embed, variables }) + } + }) + + describe('given a video link', () => { + beforeEach(() => { + fetch + .mockReturnValueOnce(Promise.resolve(new Response(''))) + .mockReturnValueOnce(Promise.resolve(JSON.stringify({}))) + variables = { url: 'https://www.w3schools.com/html/mov_bbb.mp4' } + }) + + it('shows some default data', async () => { + const expected = expect.objectContaining({ + data: { + embed: { + audio: null, + author: null, + date: null, + description: null, + html: null, + image: null, + lang: null, + publisher: null, + sources: ['resource'], + title: null, + type: 'link', + url: 'https://www.w3schools.com/html/mov_bbb.mp4', + video: null, + }, + }, + }) + await expect(embedAction(variables)).resolves.toEqual(expected) + }) + }) + + describe('given a Facebook link', () => { + beforeEach(() => { + fetch + .mockReturnValueOnce(Promise.resolve(new Response(HumanConnectionOrg))) + .mockReturnValueOnce(Promise.resolve('invalid json')) + variables = { url: 'https://www.facebook.com/HumanConnectionOrg/' } + }) + + it('does not crash if embed provider returns invalid JSON', async () => { + const expected = expect.objectContaining({ + data: { + embed: { + audio: null, + author: null, + date: expect.any(String), + description: + 'Human Connection, Weilheim an der Teck. Gefällt 24.407 Mal. An upcoming non-profit social network focused on local and global positive change. Twitter accounts : @hc_world (EN), @hc_deutschland (GE),...', + html: null, + image: + 'https://scontent.ftxl3-1.fna.fbcdn.net/v/t1.0-1/c5.0.200.200a/p200x200/12108307_997373093648222_70057205881020137_n.jpg?_nc_cat=110&_nc_oc=AQnPPYQlR0dU556gOfl4xkXr7IPZdRIAUfQeXl3fpUv4DAsFN8T4PfgOjPwuq85GPKGZ5S5E5mWQ8IVV1UiRBAIZ&_nc_ht=scontent.ftxl3-1.fna&oh=90309adddaab38839782f16e7d4b7bcf&oe=5DEEDFE5', + lang: 'de', + publisher: 'Facebook', + sources: ['resource'], + title: 'Human Connection', + type: 'link', + url: 'https://www.facebook.com/HumanConnectionOrg/', + video: null, + }, + }, + }) + await expect(embedAction(variables)).resolves.toEqual(expected) + }) + }) + + describe('given a Github link', () => { + beforeEach(() => { + fetch + .mockReturnValueOnce(Promise.resolve(new Response(pr960))) + .mockReturnValueOnce(Promise.resolve(JSON.stringify({}))) + variables = { url: 'https://github.com/Human-Connection/Human-Connection/pull/960' } + }) + + it('returns meta data even if no embed html can be retrieved', async () => { + const expected = expect.objectContaining({ + data: { + embed: { + type: 'link', + title: + 'Editor embeds merge in nitro embed by mattwr18 · Pull Request #960 · Human-Connection/Human-Connection', + author: 'Human-Connection', + publisher: 'GitHub', + date: expect.any(String), + description: '🍰 Pullrequest Issues fixes #256', + url: 'https://github.com/Human-Connection/Human-Connection/pull/960', + image: + 'https://repository-images.githubusercontent.com/112590397/52c9a000-7e11-11e9-899d-aaa55f3a3d72', + audio: null, + video: null, + lang: 'en', + sources: ['resource'], + html: null, + }, + }, + }) + await expect(embedAction(variables)).resolves.toEqual(expected) + }) + }) + + describe('given a youtube link', () => { + beforeEach(() => { + fetch + .mockReturnValueOnce(Promise.resolve(new Response(babyLovesCat))) + .mockReturnValueOnce(Promise.resolve(babyLovesCatEmbedResponse)) + variables = { url: 'https://www.youtube.com/watch?v=qkdXAtO40Fo&t=18s' } + }) + + it('returns meta data plus youtube iframe html', async () => { + const expected = expect.objectContaining({ + data: { + embed: { + type: 'video', + title: 'Baby Loves Cat', + author: 'Merkley Family', + publisher: 'YouTube', + date: expect.any(String), + description: + 'She’s incapable of controlling her limbs when her kitty is around. The obsession grows every day. Ps. That’s a sleep sack she’s in. Not a starfish outfit. Al...', + url: 'https://www.youtube.com/watch?v=qkdXAtO40Fo', + image: 'https://i.ytimg.com/vi/qkdXAtO40Fo/maxresdefault.jpg', + audio: null, + video: null, + lang: 'de', + sources: ['resource', 'oembed'], + html: + '', + }, + }, + }) + await expect(embedAction(variables)).resolves.toEqual(expected) + }) + }) + }) +}) diff --git a/backend/src/schema/resolvers/embeds/providers.json b/backend/src/schema/resolvers/embeds/providers.json new file mode 100644 index 000000000..873ac2bf8 --- /dev/null +++ b/backend/src/schema/resolvers/embeds/providers.json @@ -0,0 +1,3014 @@ +[ + { + "provider_name": "23HQ", + "provider_url": "http:\/\/www.23hq.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.23hq.com\/*\/photo\/*" + ], + "url": "http:\/\/www.23hq.com\/23\/oembed" + } + ] + }, + { + "provider_name": "Adways", + "provider_url": "http:\/\/www.adways.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/play.adpaths.com\/experience\/*" + ], + "url": "http:\/\/play.adpaths.com\/oembed\/*" + } + ] + }, + { + "provider_name": "Alpha App Net", + "provider_url": "https:\/\/alpha.app.net\/browse\/posts\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/alpha.app.net\/*\/post\/*", + "https:\/\/photos.app.net\/*\/*" + ], + "url": "https:\/\/alpha-api.app.net\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Altru", + "provider_url": "https:\/\/www.altrulabs.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.altrulabs.com\/*\/*?answer_id=*" + ], + "url": "https:\/\/api.altrulabs.com\/social\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "amCharts Live Editor", + "provider_url": "https:\/\/live.amcharts.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/live.amcharts.com\/*", + "https:\/\/live.amcharts.com\/*" + ], + "url": "https:\/\/live.amcharts.com\/oembed" + } + ] + }, + { + "provider_name": "Animatron", + "provider_url": "https:\/\/www.animatron.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.animatron.com\/project\/*", + "https:\/\/animatron.com\/project\/*" + ], + "url": "https:\/\/animatron.com\/oembed\/json", + "discovery": true + } + ] + }, + { + "provider_name": "Animoto", + "provider_url": "http:\/\/animoto.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/animoto.com\/play\/*" + ], + "url": "http:\/\/animoto.com\/oembeds\/create" + } + ] + }, + { + "provider_name": "Apester", + "provider_url": "https:\/\/www.apester.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/renderer.apester.com\/v2\/*?preview=true&iframe_preview=true" + ], + "url": "https:\/\/display.apester.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Archivos", + "provider_url": "https:\/\/app.archivos.digital", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.archivos.digital\/app\/view\/*" + ], + "url": "https:\/\/app.archivos.digital\/oembed\/" + } + ] + }, + { + "provider_name": "AudioClip", + "provider_url": "https:\/\/audioclip.naver.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/audioclip.naver.com\/channels\/*\/clips\/*", + "https:\/\/audioclip.naver.com\/audiobooks\/*" + ], + "url": "https:\/\/audioclip.naver.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Audiomack", + "provider_url": "https:\/\/www.audiomack.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.audiomack.com\/song\/*", + "https:\/\/www.audiomack.com\/album\/*", + "https:\/\/www.audiomack.com\/playlist\/*" + ], + "url": "https:\/\/www.audiomack.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "AudioSnaps", + "provider_url": "http:\/\/audiosnaps.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/audiosnaps.com\/k\/*" + ], + "url": "http:\/\/audiosnaps.com\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Backtracks", + "provider_url": "https:\/\/backtracks.fm", + "endpoints": [ + { + "schemes": [ + "https:\/\/backtracks.fm\/*\/*\/e\/*", + "https:\/\/backtracks.fm\/*", + "http:\/\/backtracks.fm\/*" + ], + "url": "https:\/\/backtracks.fm\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Beautiful.AI", + "provider_url": "https:\/\/www.beautiful.ai\/", + "endpoints": [ + { + "url": "https:\/\/www.beautiful.ai\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Blackfire.io", + "provider_url": "https:\/\/blackfire.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/blackfire.io\/profiles\/*\/graph", + "https:\/\/blackfire.io\/profiles\/compare\/*\/graph" + ], + "url": "https:\/\/blackfire.io\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Box Office Buz", + "provider_url": "http:\/\/boxofficebuz.com", + "endpoints": [ + { + "url": "http:\/\/boxofficebuz.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "BrioVR", + "provider_url": "https:\/\/view.briovr.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/*" + ], + "url": "https:\/\/view.briovr.com\/api\/v1\/worlds\/oembed\/" + } + ] + }, + { + "provider_name": "Buttondown", + "provider_url": "https:\/\/buttondown.email\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/buttondown.email\/*" + ], + "url": "https:\/\/buttondown.email\/embed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Byzart Project", + "provider_url": "https:\/\/cmc.byzart.eu", + "endpoints": [ + { + "schemes": [ + "https:\/\/cmc.byzart.eu\/files\/*" + ], + "url": "https:\/\/cmc.byzart.eu\/oembed\/", + "discovery": false + } + ] + }, + { + "provider_name": "Cacoo", + "provider_url": "https:\/\/cacoo.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/cacoo.com\/diagrams\/*" + ], + "url": "http:\/\/cacoo.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Carbon Health", + "provider_url": "https:\/\/carbonhealth.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/carbonhealth.com\/practice\/*" + ], + "url": "http:\/\/carbonhealth.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "CatBoat", + "provider_url": "http:\/\/img.catbo.at\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/img.catbo.at\/*" + ], + "url": "http:\/\/img.catbo.at\/oembed.json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Ceros", + "provider_url": "http:\/\/www.ceros.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/view.ceros.com\/*" + ], + "url": "http:\/\/view.ceros.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ChartBlocks", + "provider_url": "http:\/\/www.chartblocks.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/public.chartblocks.com\/c\/*" + ], + "url": "http:\/\/embed.chartblocks.com\/1.0\/oembed" + } + ] + }, + { + "provider_name": "chirbit.com", + "provider_url": "http:\/\/www.chirbit.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/chirb.it\/*" + ], + "url": "http:\/\/chirb.it\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "CircuitLab", + "provider_url": "https:\/\/www.circuitlab.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.circuitlab.com\/circuit\/*" + ], + "url": "https:\/\/www.circuitlab.com\/circuit\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Clipland", + "provider_url": "http:\/\/www.clipland.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.clipland.com\/v\/*", + "https:\/\/www.clipland.com\/v\/*" + ], + "url": "https:\/\/www.clipland.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Clyp", + "provider_url": "http:\/\/clyp.it\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/clyp.it\/*", + "http:\/\/clyp.it\/playlist\/*" + ], + "url": "http:\/\/api.clyp.it\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "CodeHS", + "provider_url": "http:\/\/www.codehs.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/codehs.com\/editor\/share_abacus\/*" + ], + "url": "https:\/\/codehs.com\/api\/sharedprogram\/*\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Codepen", + "provider_url": "https:\/\/codepen.io", + "endpoints": [ + { + "schemes": [ + "http:\/\/codepen.io\/*", + "https:\/\/codepen.io\/*" + ], + "url": "http:\/\/codepen.io\/api\/oembed" + } + ] + }, + { + "provider_name": "Codepoints", + "provider_url": "https:\/\/codepoints.net", + "endpoints": [ + { + "schemes": [ + "http:\/\/codepoints.net\/*", + "https:\/\/codepoints.net\/*", + "http:\/\/www.codepoints.net\/*", + "https:\/\/www.codepoints.net\/*" + ], + "url": "https:\/\/codepoints.net\/api\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "CodeSandbox", + "provider_url": "https:\/\/codesandbox.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/codesandbox.io\/s\/*", + "https:\/\/codesandbox.io\/embed\/*" + ], + "url": "https:\/\/codesandbox.io\/oembed" + } + ] + }, + { + "provider_name": "CollegeHumor", + "provider_url": "http:\/\/www.collegehumor.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.collegehumor.com\/video\/*" + ], + "url": "http:\/\/www.collegehumor.com\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Commaful", + "provider_url": "https:\/\/commaful.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/commaful.com\/play\/*" + ], + "url": "https:\/\/commaful.com\/api\/oembed\/" + } + ] + }, + { + "provider_name": "Coub", + "provider_url": "http:\/\/coub.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/coub.com\/view\/*", + "http:\/\/coub.com\/embed\/*" + ], + "url": "http:\/\/coub.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "Crowd Ranking", + "provider_url": "http:\/\/crowdranking.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/crowdranking.com\/*\/*" + ], + "url": "http:\/\/crowdranking.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "Cyrano Systems", + "provider_url": "http:\/\/www.cyranosystems.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/staging.cyranosystems.com\/msg\/*", + "https:\/\/app.cyranosystems.com\/msg\/*" + ], + "url": "https:\/\/staging.cyranosystems.com\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Daily Mile", + "provider_url": "http:\/\/www.dailymile.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.dailymile.com\/people\/*\/entries\/*" + ], + "url": "http:\/\/api.dailymile.com\/oembed?format=json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Dailymotion", + "provider_url": "https:\/\/www.dailymotion.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.dailymotion.com\/video\/*" + ], + "url": "https:\/\/www.dailymotion.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Deseretnews.com", + "provider_url": "https:\/\/www.deseretnews.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.deseretnews.com\/*" + ], + "url": "https:\/\/embed.deseretnews.com\/" + } + ] + }, + { + "provider_name": "Deviantart.com", + "provider_url": "http:\/\/www.deviantart.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.deviantart.com\/art\/*", + "http:\/\/*.deviantart.com\/*#\/d*", + "http:\/\/fav.me\/*", + "http:\/\/sta.sh\/*", + "https:\/\/*.deviantart.com\/art\/*", + "https:\/\/*.deviantart.com\/*\/art\/*", + "https:\/\/sta.sh\/*\",", + "https:\/\/*.deviantart.com\/*#\/d*\"" + ], + "url": "http:\/\/backend.deviantart.com\/oembed" + } + ] + }, + { + "provider_name": "Didacte", + "provider_url": "https:\/\/www.didacte.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.didacte.com\/a\/course\/*" + ], + "url": "https:\/\/*.didacte.com\/cards\/oembed'", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Digiteka", + "provider_url": "https:\/\/www.ultimedia.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.ultimedia.com\/central\/video\/edit\/id\/*\/topic_id\/*\/", + "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*\/showtitle\/1\/viewnc\/1", + "https:\/\/www.ultimedia.com\/default\/index\/videogeneric\/id\/*" + ], + "url": "https:\/\/www.ultimedia.com\/api\/search\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Dipity", + "provider_url": "http:\/\/www.dipity.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.dipity.com\/*\/*\/" + ], + "url": "http:\/\/www.dipity.com\/oembed\/timeline\/" + } + ] + }, + { + "provider_name": "DocDroid", + "provider_url": "https:\/\/www.docdroid.net\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.docdroid.net\/*", + "http:\/\/*.docdroid.net\/*", + "https:\/\/docdro.id\/*", + "http:\/\/docdro.id\/*" + ], + "url": "https:\/\/www.docdroid.net\/api\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Dotsub", + "provider_url": "http:\/\/dotsub.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/dotsub.com\/view\/*" + ], + "url": "http:\/\/dotsub.com\/services\/oembed" + } + ] + }, + { + "provider_name": "DTube", + "provider_url": "https:\/\/d.tube\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/d.tube\/v\/*" + ], + "url": "https:\/\/api.d.tube\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "edocr", + "provider_url": "http:\/\/www.edocr.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/edocr.com\/docs\/*" + ], + "url": "http:\/\/edocr.com\/api\/oembed" + } + ] + }, + { + "provider_name": "eduMedia", + "provider_url": "https:\/\/www.edumedia-sciences.com\/", + "endpoints": [ + { + "url": "https:\/\/www.edumedia-sciences.com\/oembed.json", + "discovery": true + }, + { + "url": "https:\/\/www.edumedia-sciences.com\/oembed.xml", + "discovery": true + } + ] + }, + { + "provider_name": "EgliseInfo", + "provider_url": "http:\/\/egliseinfo.catholique.fr\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/egliseinfo.catholique.fr\/*" + ], + "url": "http:\/\/egliseinfo.catholique.fr\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Embed Articles", + "provider_url": "http:\/\/embedarticles.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/embedarticles.com\/*" + ], + "url": "http:\/\/embedarticles.com\/oembed\/" + } + ] + }, + { + "provider_name": "Embedly", + "provider_url": "http:\/\/api.embed.ly\/", + "endpoints": [ + { + "url": "http:\/\/api.embed.ly\/1\/oembed" + } + ] + }, + { + "provider_name": "Ethfiddle", + "provider_url": "https:\/\/www.ethfiddle.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/ethfiddle.com\/*" + ], + "url": "https:\/\/ethfiddle.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Eyrie", + "provider_url": "https:\/\/eyrie.io\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/eyrie.io\/board\/*", + "https:\/\/eyrie.io\/sparkfun\/*" + ], + "url": "https:\/\/eyrie.io\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Post)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/posts\/*", + "https:\/\/www.facebook.com\/photos\/*", + "https:\/\/www.facebook.com\/*\/photos\/*", + "https:\/\/www.facebook.com\/photo.php*", + "https:\/\/www.facebook.com\/photo.php", + "https:\/\/www.facebook.com\/*\/activity\/*", + "https:\/\/www.facebook.com\/permalink.php", + "https:\/\/www.facebook.com\/media\/set?set=*", + "https:\/\/www.facebook.com\/questions\/*", + "https:\/\/www.facebook.com\/notes\/*\/*\/*" + ], + "url": "https:\/\/www.facebook.com\/plugins\/post\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Facebook (Video)", + "provider_url": "https:\/\/www.facebook.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.facebook.com\/*\/videos\/*", + "https:\/\/www.facebook.com\/video.php" + ], + "url": "https:\/\/www.facebook.com\/plugins\/video\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "Fader", + "provider_url": "https:\/\/app.getfader.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.getfader.com\/projects\/*\/publish" + ], + "url": "https:\/\/app.getfader.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Faithlife TV", + "provider_url": "https:\/\/faithlifetv.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/faithlifetv.com\/items\/*", + "https:\/\/faithlifetv.com\/items\/resource\/*\/*", + "https:\/\/faithlifetv.com\/media\/*", + "https:\/\/faithlifetv.com\/media\/assets\/*", + "https:\/\/faithlifetv.com\/media\/resource\/*\/*" + ], + "url": "https:\/\/faithlifetv.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "FITE", + "provider_url": "https:\/\/www.fite.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.fite.tv\/watch\/*" + ], + "url": "https:\/\/www.fite.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Flat", + "provider_url": "https:\/\/flat.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/flat.io\/score\/*", + "https:\/\/*.flat.io\/score\/*" + ], + "url": "https:\/\/flat.io\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Flickr", + "provider_url": "https:\/\/www.flickr.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.flickr.com\/photos\/*", + "http:\/\/flic.kr\/p\/*", + "https:\/\/*.flickr.com\/photos\/*", + "https:\/\/flic.kr\/p\/*" + ], + "url": "https:\/\/www.flickr.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Flourish", + "provider_url": "https:\/\/flourish.studio\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/public.flourish.studio\/visualisation\/*", + "https:\/\/public.flourish.studio\/story\/*" + ], + "url": "https:\/\/app.flourish.studio\/api\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Fontself", + "provider_url": "https:\/\/www.fontself.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/catapult.fontself.com\/*" + ], + "url": "https:\/\/oembed.fontself.com\/" + } + ] + }, + { + "provider_name": "FOX SPORTS Australia", + "provider_url": "http:\/\/www.foxsports.com.au", + "endpoints": [ + { + "schemes": [ + "http:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*", + "https:\/\/fiso.foxsports.com.au\/isomorphic-widget\/*" + ], + "url": "https:\/\/fiso.foxsports.com.au\/oembed" + } + ] + }, + { + "provider_name": "FrameBuzz", + "provider_url": "https:\/\/framebuzz.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/framebuzz.com\/v\/*", + "https:\/\/framebuzz.com\/v\/*" + ], + "url": "https:\/\/framebuzz.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "FunnyOrDie", + "provider_url": "http:\/\/www.funnyordie.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.funnyordie.com\/videos\/*" + ], + "url": "http:\/\/www.funnyordie.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Geograph Britain and Ireland", + "provider_url": "https:\/\/www.geograph.org.uk\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.geograph.org.uk\/*", + "http:\/\/*.geograph.co.uk\/*", + "http:\/\/*.geograph.ie\/*", + "http:\/\/*.wikimedia.org\/*_geograph.org.uk_*" + ], + "url": "http:\/\/api.geograph.org.uk\/api\/oembed" + } + ] + }, + { + "provider_name": "Geograph Channel Islands", + "provider_url": "http:\/\/channel-islands.geograph.org\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.geograph.org.gg\/*", + "http:\/\/*.geograph.org.je\/*", + "http:\/\/channel-islands.geograph.org\/*", + "http:\/\/channel-islands.geographs.org\/*", + "http:\/\/*.channel.geographs.org\/*" + ], + "url": "http:\/\/www.geograph.org.gg\/api\/oembed" + } + ] + }, + { + "provider_name": "Geograph Germany", + "provider_url": "http:\/\/geo-en.hlipp.de\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/geo-en.hlipp.de\/*", + "http:\/\/geo.hlipp.de\/*", + "http:\/\/germany.geograph.org\/*" + ], + "url": "http:\/\/geo.hlipp.de\/restapi.php\/api\/oembed" + } + ] + }, + { + "provider_name": "Getty Images", + "provider_url": "http:\/\/www.gettyimages.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/gty.im\/*" + ], + "url": "http:\/\/embed.gettyimages.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Gfycat", + "provider_url": "https:\/\/gfycat.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/gfycat.com\/*", + "http:\/\/www.gfycat.com\/*", + "https:\/\/gfycat.com\/*", + "https:\/\/www.gfycat.com\/*" + ], + "url": "https:\/\/api.gfycat.com\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Gifnote", + "provider_url": "https:\/\/www.gifnote.com\/", + "endpoints": [ + { + "url": "https:\/\/www.gifnote.com\/services\/oembed", + "schemes": [ + "https:\/\/www.gifnote.com\/play\/*" + ], + "discovery": true + } + ] + }, + { + "provider_name": "GIPHY", + "provider_url": "https:\/\/giphy.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/giphy.com\/gifs\/*", + "http:\/\/gph.is\/*", + "https:\/\/media.giphy.com\/media\/*\/giphy.gif" + ], + "url": "https:\/\/giphy.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "GloriaTV", + "provider_url": "https:\/\/gloria.tv\/", + "endpoints": [ + { + "url": "https:\/\/gloria.tv\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "GT Channel", + "provider_url": "https:\/\/gtchannel.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/gtchannel.com\/watch\/*" + ], + "url": "https:\/\/api.luminery.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Gyazo", + "provider_url": "https:\/\/gyazo.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/gyazo.com\/*" + ], + "url": "https:\/\/api.gyazo.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "hearthis.at", + "provider_url": "https:\/\/hearthis.at\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/hearthis.at\/*\/*\/" + ], + "url": "https:\/\/hearthis.at\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "HuffDuffer", + "provider_url": "http:\/\/huffduffer.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/huffduffer.com\/*\/*" + ], + "url": "http:\/\/huffduffer.com\/oembed" + } + ] + }, + { + "provider_name": "Hulu", + "provider_url": "http:\/\/www.hulu.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.hulu.com\/watch\/*" + ], + "url": "http:\/\/www.hulu.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "iFixit", + "provider_url": "http:\/\/www.iFixit.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.ifixit.com\/Guide\/View\/*" + ], + "url": "http:\/\/www.ifixit.com\/Embed" + } + ] + }, + { + "provider_name": "IFTTT", + "provider_url": "http:\/\/www.ifttt.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/ifttt.com\/recipes\/*" + ], + "url": "http:\/\/www.ifttt.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Indaco", + "provider_url": "https:\/\/player.indacolive.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/player.indacolive.com\/player\/jwp\/clients\/*" + ], + "url": "https:\/\/player.indacolive.com\/services\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Infogram", + "provider_url": "https:\/\/infogr.am\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/infogr.am\/*" + ], + "url": "https:\/\/infogr.am\/oembed" + } + ] + }, + { + "provider_name": "Infoveave", + "provider_url": "https:\/\/infoveave.net\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.infoveave.net\/E\/*", + "https:\/\/*.infoveave.net\/P\/*" + ], + "url": "https:\/\/infoveave.net\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Injurymap", + "provider_url": "https:\/\/www.injurymap.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.injurymap.com\/exercises\/*" + ], + "url": "https:\/\/www.injurymap.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Inoreader", + "provider_url": "https:\/\/www.inoreader.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.inoreader.com\/oembed\/" + ], + "url": "https:\/\/www.inoreader.com\/oembed\/api\/", + "discovery": true + } + ] + }, + { + "provider_name": "inphood", + "provider_url": "http:\/\/inphood.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.inphood.com\/*" + ], + "url": "http:\/\/api.inphood.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Instagram", + "provider_url": "https:\/\/instagram.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/instagram.com\/p\/*", + "http:\/\/instagr.am\/p\/*", + "http:\/\/www.instagram.com\/p\/*", + "http:\/\/www.instagr.am\/p\/*", + "https:\/\/instagram.com\/p\/*", + "https:\/\/instagr.am\/p\/*", + "https:\/\/www.instagram.com\/p\/*", + "https:\/\/www.instagr.am\/p\/*" + ], + "url": "https:\/\/api.instagram.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "iSnare Articles", + "provider_url": "https:\/\/www.isnare.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.isnare.com\/*" + ], + "url": "https:\/\/www.isnare.com\/oembed\/" + } + ] + }, + { + "provider_name": "Issuu", + "provider_url": "https:\/\/issuu.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/issuu.com\/*\/docs\/*" + ], + "url": "https:\/\/issuu.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ivlismusic", + "provider_url": "https:\/\/music.ivlis.kr\/", + "endpoints": [ + { + "url": "https:\/\/music.ivlis.kr\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "KakaoTv", + "provider_url": "https:\/\/tv.kakao.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/tv.kakao.com\/channel\/*\/cliplink\/*", + "https:\/\/tv.kakao.com\/channel\/v\/*", + "https:\/\/tv.kakao.com\/channel\/*\/livelink\/*", + "https:\/\/tv.kakao.com\/channel\/l\/*" + ], + "url": "https:\/\/tv.kakao.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Kickstarter", + "provider_url": "http:\/\/www.kickstarter.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.kickstarter.com\/projects\/*" + ], + "url": "http:\/\/www.kickstarter.com\/services\/oembed" + } + ] + }, + { + "provider_name": "Kidoju", + "provider_url": "https:\/\/www.kidoju.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.kidoju.com\/en\/x\/*\/*", + "https:\/\/www.kidoju.com\/fr\/x\/*\/*" + ], + "url": "https:\/\/www.kidoju.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Kit", + "provider_url": "https:\/\/kit.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/kit.com\/*\/*", + "https:\/\/kit.com\/*\/*" + ], + "url": "https:\/\/embed.kit.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Kitchenbowl", + "provider_url": "http:\/\/www.kitchenbowl.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.kitchenbowl.com\/recipe\/*" + ], + "url": "http:\/\/www.kitchenbowl.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Knacki", + "provider_url": "http:\/\/jdr.knacki.info", + "endpoints": [ + { + "schemes": [ + "http:\/\/jdr.knacki.info\/meuh\/*", + "https:\/\/jdr.knacki.info\/meuh\/*" + ], + "url": "https:\/\/jdr.knacki.info\/oembed" + } + ] + }, + { + "provider_name": "LearningApps.org", + "provider_url": "http:\/\/learningapps.org\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/learningapps.org\/*" + ], + "url": "http:\/\/learningapps.org\/oembed.php", + "discovery": true + } + ] + }, + { + "provider_name": "Lille.Pod", + "provider_url": "https:\/\/pod.univ-lille.fr\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/pod.univ-lille.fr\/video\/*" + ], + "url": "https:\/\/pod.univ-lille.fr\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Livestream", + "provider_url": "https:\/\/livestream.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/livestream.com\/accounts\/*\/events\/*", + "https:\/\/livestream.com\/accounts\/*\/events\/*\/videos\/*", + "https:\/\/livestream.com\/*\/events\/*", + "https:\/\/livestream.com\/*\/events\/*\/videos\/*", + "https:\/\/livestream.com\/*\/*", + "https:\/\/livestream.com\/*\/*\/videos\/*" + ], + "url": "https:\/\/livestream.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Ludus", + "provider_url": "https:\/\/ludus.one", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.ludus.one\/*" + ], + "url": "https:\/\/app.ludus.one\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "MathEmbed", + "provider_url": "http:\/\/mathembed.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/mathembed.com\/latex?inputText=*", + "http:\/\/mathembed.com\/latex?inputText=*" + ], + "url": "http:\/\/mathembed.com\/oembed" + } + ] + }, + { + "provider_name": "Matterport", + "provider_url": "https:\/\/matterport.com\/", + "endpoints": [ + { + "url": "https:\/\/my.matterport.com\/api\/v1\/models\/oembed\/", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "me.me", + "provider_url": "https:\/\/me.me\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/me.me\/i\/*" + ], + "url": "https:\/\/me.me\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Medienarchiv der K\u00fcnste - Z\u00fcrcher Hochschule der K\u00fcnste", + "provider_url": "https:\/\/medienarchiv.zhdk.ch\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/medienarchiv.zhdk.ch\/entries\/*" + ], + "url": "https:\/\/medienarchiv.zhdk.ch\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Meetup", + "provider_url": "http:\/\/www.meetup.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/meetup.com\/*", + "https:\/\/www.meetup.com\/*", + "https:\/\/meetup.com\/*", + "http:\/\/meetu.ps\/*" + ], + "url": "https:\/\/api.meetup.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "MixCloud", + "provider_url": "https:\/\/mixcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.mixcloud.com\/*\/*\/", + "https:\/\/www.mixcloud.com\/*\/*\/" + ], + "url": "https:\/\/www.mixcloud.com\/oembed\/" + } + ] + }, + { + "provider_name": "Moby Picture", + "provider_url": "http:\/\/www.mobypicture.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.mobypicture.com\/user\/*\/view\/*", + "http:\/\/moby.to\/*" + ], + "url": "http:\/\/api.mobypicture.com\/oEmbed" + } + ] + }, + { + "provider_name": "Modelo", + "provider_url": "http:\/\/modelo.io\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/beta.modelo.io\/embedded\/*" + ], + "url": "https:\/\/portal.modelo.io\/oembed", + "discovery": false + } + ] + }, + { + "provider_name": "MorphCast", + "provider_url": "https:\/\/www.morphcast.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/m-roll.morphcast.com\/mroll\/*" + ], + "url": "https:\/\/m-roll.morphcast.com\/service\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Music Box Maniacs", + "provider_url": "https:\/\/musicboxmaniacs.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/musicboxmaniacs.com\/explore\/melody\/*" + ], + "url": "https:\/\/musicboxmaniacs.com\/embed\/", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "myBeweeg", + "provider_url": "https:\/\/mybeweeg.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/mybeweeg.com\/w\/*" + ], + "url": "https:\/\/mybeweeg.com\/services\/oembed" + } + ] + }, + { + "provider_name": "Namchey", + "provider_url": "https:\/\/namchey.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/namchey.com\/embeds\/*" + ], + "url": "https:\/\/namchey.com\/api\/oembed", + "formats": [ + "json", + "xml" + ], + "discovery": true + } + ] + }, + { + "provider_name": "nanoo.tv", + "provider_url": "https:\/\/www.nanoo.tv\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.nanoo.tv\/link\/*", + "http:\/\/nanoo.tv\/link\/*", + "http:\/\/*.nanoo.pro\/link\/*", + "http:\/\/nanoo.pro\/link\/*", + "https:\/\/*.nanoo.tv\/link\/*", + "https:\/\/nanoo.tv\/link\/*", + "https:\/\/*.nanoo.pro\/link\/*", + "https:\/\/nanoo.pro\/link\/*", + "http:\/\/media.zhdk.ch\/signatur\/*", + "http:\/\/new.media.zhdk.ch\/signatur\/*", + "https:\/\/media.zhdk.ch\/signatur\/*", + "https:\/\/new.media.zhdk.ch\/signatur\/*" + ], + "url": "https:\/\/www.nanoo.tv\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Nasjonalbiblioteket", + "provider_url": "https:\/\/www.nb.no\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.nb.no\/items\/*" + ], + "url": "https:\/\/api.nb.no\/catalog\/v1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Natural Atlas", + "provider_url": "https:\/\/naturalatlas.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/naturalatlas.com\/*", + "https:\/\/naturalatlas.com\/*\/*", + "https:\/\/naturalatlas.com\/*\/*\/*", + "https:\/\/naturalatlas.com\/*\/*\/*\/*" + ], + "url": "https:\/\/naturalatlas.com\/oembed.{format}", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "nfb.ca", + "provider_url": "http:\/\/www.nfb.ca\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.nfb.ca\/film\/*" + ], + "url": "http:\/\/www.nfb.ca\/remote\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Odds.com.au", + "provider_url": "https:\/\/www.odds.com.au", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.odds.com.au\/*", + "https:\/\/odds.com.au\/*" + ], + "url": "https:\/\/www.odds.com.au\/api\/oembed\/" + } + ] + }, + { + "provider_name": "Official FM", + "provider_url": "http:\/\/official.fm", + "endpoints": [ + { + "schemes": [ + "http:\/\/official.fm\/tracks\/*", + "http:\/\/official.fm\/playlists\/*" + ], + "url": "http:\/\/official.fm\/services\/oembed.{format}" + } + ] + }, + { + "provider_name": "Omniscope", + "provider_url": "https:\/\/omniscope.me\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/omniscope.me\/*" + ], + "url": "https:\/\/omniscope.me\/_global_\/oembed\/json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "On Aol", + "provider_url": "http:\/\/on.aol.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/on.aol.com\/video\/*" + ], + "url": "http:\/\/on.aol.com\/api" + } + ] + }, + { + "provider_name": "Ora TV", + "provider_url": "http:\/\/www.ora.tv\/", + "endpoints": [ + { + "discovery": true, + "url": "https:\/\/www.ora.tv\/oembed\/*?format={format}" + } + ] + }, + { + "provider_name": "Orbitvu", + "provider_url": "https:\/\/orbitvu.co", + "endpoints": [ + { + "schemes": [ + "https:\/\/orbitvu.co\/001\/*\/ov3601\/view", + "https:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view", + "https:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3601\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3601\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/ov3602\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/2\/orbittour\/*\/view", + "http:\/\/orbitvu.co\/001\/*\/1\/2\/orbittour\/*\/view" + ], + "url": "http:\/\/orbitvu.co\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Oumy", + "provider_url": "https:\/\/www.oumy.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.oumy.com\/v\/*" + ], + "url": "https:\/\/www.oumy.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Outplayed.tv", + "provider_url": "https:\/\/outplayed.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/outplayed.tv\/media\/*" + ], + "url": "https:\/\/outplayed.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Overflow", + "provider_url": "https:\/\/overflow.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/overflow.io\/s\/*", + "https:\/\/overflow.io\/embed\/*" + ], + "url": "https:\/\/overflow.io\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Pastery", + "provider_url": "https:\/\/www.pastery.net", + "endpoints": [ + { + "schemes": [ + "http:\/\/pastery.net\/*", + "https:\/\/pastery.net\/*", + "http:\/\/www.pastery.net\/*", + "https:\/\/www.pastery.net\/*" + ], + "url": "https:\/\/www.pastery.net\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "PingVP", + "provider_url": "https:\/\/www.pingvp.com\/", + "endpoints": [ + { + "url": "https:\/\/beta.pingvp.com.kpnis.nl\/p\/oembed.php", + "discovery": true + } + ] + }, + { + "provider_name": "Pixdor", + "provider_url": "http:\/\/www.pixdor.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/store.pixdor.com\/place-marker-widget\/*\/show", + "https:\/\/store.pixdor.com\/map\/*\/show" + ], + "url": "https:\/\/store.pixdor.com\/oembed", + "formats": [ + "json", + "xml" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Podbean", + "provider_url": "http:\/\/podbean.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.podbean.com\/e\/*", + "http:\/\/*.podbean.com\/e\/*" + ], + "url": "https:\/\/api.podbean.com\/v1\/oembed" + } + ] + }, + { + "provider_name": "Poll Daddy", + "provider_url": "http:\/\/polldaddy.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.polldaddy.com\/s\/*", + "http:\/\/*.polldaddy.com\/poll\/*", + "http:\/\/*.polldaddy.com\/ratings\/*" + ], + "url": "http:\/\/polldaddy.com\/oembed\/" + } + ] + }, + { + "provider_name": "Port", + "provider_url": "http:\/\/www.sellwithport.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/app.sellwithport.com\/#\/buyer\/*" + ], + "url": "https:\/\/api.sellwithport.com\/v1.0\/buyer\/oembed" + } + ] + }, + { + "provider_name": "Portfolium", + "provider_url": "https:\/\/portfolium.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/portfolium.com\/entry\/*" + ], + "url": "https:\/\/api.portfolium.com\/oembed" + } + ] + }, + { + "provider_name": "posiXion", + "provider_url": "https:\/\/posixion.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/posixion.com\/question\/*", + "https:\/\/posixion.com\/*\/question\/*" + ], + "url": "http:\/\/posixion.com\/services\/oembed\/" + } + ] + }, + { + "provider_name": "Quiz.biz", + "provider_url": "http:\/\/www.quiz.biz\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.quiz.biz\/quizz-*.html" + ], + "url": "http:\/\/www.quiz.biz\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Quizz.biz", + "provider_url": "http:\/\/www.quizz.biz\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.quizz.biz\/quizz-*.html" + ], + "url": "http:\/\/www.quizz.biz\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RapidEngage", + "provider_url": "https:\/\/rapidengage.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/rapidengage.com\/s\/*" + ], + "url": "https:\/\/rapidengage.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Reddit", + "provider_url": "https:\/\/reddit.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/reddit.com\/r\/*\/comments\/*\/*", + "https:\/\/www.reddit.com\/r\/*\/comments\/*\/*" + ], + "url": "https:\/\/www.reddit.com\/oembed" + } + ] + }, + { + "provider_name": "ReleaseWire", + "provider_url": "http:\/\/www.releasewire.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/rwire.com\/*" + ], + "url": "http:\/\/publisher.releasewire.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Replit", + "provider_url": "https:\/\/repl.it\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/repl.it\/@*\/*" + ], + "url": "https:\/\/repl.it\/data\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RepubHub", + "provider_url": "http:\/\/repubhub.icopyright.net\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/repubhub.icopyright.net\/freePost.act?*" + ], + "url": "http:\/\/repubhub.icopyright.net\/oembed.act", + "discovery": true + } + ] + }, + { + "provider_name": "ReverbNation", + "provider_url": "https:\/\/www.reverbnation.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.reverbnation.com\/*", + "https:\/\/www.reverbnation.com\/*\/songs\/*" + ], + "url": "https:\/\/www.reverbnation.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "RiffReporter", + "provider_url": "https:\/\/www.riffreporter.de\/", + "endpoints": [ + { + "url": "https:\/\/www.riffreporter.de\/service\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Roomshare", + "provider_url": "http:\/\/roomshare.jp", + "endpoints": [ + { + "schemes": [ + "http:\/\/roomshare.jp\/post\/*", + "http:\/\/roomshare.jp\/en\/post\/*" + ], + "url": "http:\/\/roomshare.jp\/en\/oembed.{format}" + } + ] + }, + { + "provider_name": "RoosterTeeth", + "provider_url": "https:\/\/roosterteeth.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/roosterteeth.com\/*" + ], + "url": "https:\/\/roosterteeth.com\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Rumble", + "provider_url": "https:\/\/rumble.com\/", + "endpoints": [ + { + "url": "https:\/\/rumble.com\/api\/Media\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Sapo Videos", + "provider_url": "http:\/\/videos.sapo.pt", + "endpoints": [ + { + "schemes": [ + "http:\/\/videos.sapo.pt\/*" + ], + "url": "http:\/\/videos.sapo.pt\/oembed" + } + ] + }, + { + "provider_name": "Screen9", + "provider_url": "http:\/\/www.screen9.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/console.screen9.com\/*", + "https:\/\/*.screen9.tv\/*" + ], + "url": "https:\/\/api.screen9.com\/oembed" + } + ] + }, + { + "provider_name": "Screencast.com", + "provider_url": "http:\/\/www.screencast.com\/", + "endpoints": [ + { + "url": "https:\/\/api.screencast.com\/external\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Screenr", + "provider_url": "http:\/\/www.screenr.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.screenr.com\/*\/" + ], + "url": "http:\/\/www.screenr.com\/api\/oembed.{format}" + } + ] + }, + { + "provider_name": "ScribbleMaps", + "provider_url": "https:\/\/scribblemaps.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.scribblemaps.com\/maps\/view\/*", + "https:\/\/www.scribblemaps.com\/maps\/view\/*", + "http:\/\/scribblemaps.com\/maps\/view\/*", + "https:\/\/scribblemaps.com\/maps\/view\/*" + ], + "url": "https:\/\/scribblemaps.com\/api\/services\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Scribd", + "provider_url": "http:\/\/www.scribd.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.scribd.com\/doc\/*" + ], + "url": "http:\/\/www.scribd.com\/services\/oembed\/" + } + ] + }, + { + "provider_name": "SendtoNews", + "provider_url": "http:\/\/www.sendtonews.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/embed.sendtonews.com\/oembed\/*" + ], + "url": "https:\/\/embed.sendtonews.com\/services\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "ShortNote", + "provider_url": "https:\/\/www.shortnote.jp\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.shortnote.jp\/view\/notes\/*" + ], + "url": "https:\/\/www.shortnote.jp\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Shoudio", + "provider_url": "http:\/\/shoudio.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/shoudio.com\/*", + "http:\/\/shoud.io\/*" + ], + "url": "http:\/\/shoudio.com\/api\/oembed" + } + ] + }, + { + "provider_name": "Show the Way, actionable location info", + "provider_url": "https:\/\/showtheway.io", + "endpoints": [ + { + "schemes": [ + "https:\/\/showtheway.io\/to\/*" + ], + "url": "https:\/\/showtheway.io\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Simplecast", + "provider_url": "https:\/\/simplecast.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/simplecast.com\/s\/*" + ], + "url": "https:\/\/simplecast.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Sizzle", + "provider_url": "https:\/\/onsizzle.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/onsizzle.com\/i\/*" + ], + "url": "https:\/\/onsizzle.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Sketchfab", + "provider_url": "http:\/\/sketchfab.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/sketchfab.com\/models\/*", + "https:\/\/sketchfab.com\/models\/*", + "https:\/\/sketchfab.com\/*\/folders\/*" + ], + "url": "http:\/\/sketchfab.com\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "SlideShare", + "provider_url": "http:\/\/www.slideshare.net\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.slideshare.net\/*\/*", + "http:\/\/fr.slideshare.net\/*\/*", + "http:\/\/de.slideshare.net\/*\/*", + "http:\/\/es.slideshare.net\/*\/*", + "http:\/\/pt.slideshare.net\/*\/*" + ], + "url": "http:\/\/www.slideshare.net\/api\/oembed\/2", + "discovery": true + } + ] + }, + { + "provider_name": "SmashNotes", + "provider_url": "https:\/\/smashnotes.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/smashnotes.com\/p\/*", + "https:\/\/smashnotes.com\/p\/*\/e\/* - https:\/\/smashnotes.com\/p\/*\/e\/*\/s\/*" + ], + "url": "https:\/\/smashnotes.com\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "SmugMug", + "provider_url": "http:\/\/www.smugmug.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.smugmug.com\/*" + ], + "url": "http:\/\/api.smugmug.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "SocialExplorer", + "provider_url": "https:\/\/www.socialexplorer.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.socialexplorer.com\/*\/explore", + "https:\/\/www.socialexplorer.com\/*\/view", + "https:\/\/www.socialexplorer.com\/*\/edit", + "https:\/\/www.socialexplorer.com\/*\/embed" + ], + "url": "https:\/\/www.socialexplorer.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Songlink", + "provider_url": "https:\/\/song.link", + "endpoints": [ + { + "schemes": [ + "https:\/\/song.link\/*" + ], + "url": "https:\/\/song.link\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "SoundCloud", + "provider_url": "http:\/\/soundcloud.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/soundcloud.com\/*", + "https:\/\/soundcloud.com\/*" + ], + "url": "https:\/\/soundcloud.com\/oembed" + } + ] + }, + { + "provider_name": "Soundsgood", + "provider_url": "https:\/\/soundsgood.co", + "endpoints": [ + { + "schemes": [ + "https:\/\/play.soundsgood.co\/playlist\/*", + "https:\/\/soundsgood.co\/playlist\/*" + ], + "url": "https:\/\/play.soundsgood.co\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "SpeakerDeck", + "provider_url": "https:\/\/speakerdeck.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/speakerdeck.com\/*\/*", + "https:\/\/speakerdeck.com\/*\/*" + ], + "url": "https:\/\/speakerdeck.com\/oembed.json", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Spotful", + "provider_url": "https:\/\/bespotful.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/play.bespotful.com\/*" + ], + "url": "https:\/\/api.bespotful.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Spotify", + "provider_url": "https:\/\/spotify.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.spotify.com\/*", + "spotify:*" + ], + "url": "https:\/\/embed.spotify.com\/oembed\/" + } + ] + }, + { + "provider_name": "Spreaker", + "provider_url": "https:\/\/www.spreaker.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.spreaker.com\/*", + "https:\/\/*.spreaker.com\/*" + ], + "url": "https:\/\/api.spreaker.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Stanford Digital Repository", + "provider_url": "https:\/\/purl.stanford.edu\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/purl.stanford.edu\/*" + ], + "url": "https:\/\/purl.stanford.edu\/embed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Streamable", + "provider_url": "https:\/\/streamable.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/streamable.com\/*", + "https:\/\/streamable.com\/*" + ], + "url": "https:\/\/api.streamable.com\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "StreamOneCloud", + "provider_url": "https:\/\/www.streamone.nl", + "endpoints": [ + { + "schemes": [ + "https:\/\/content.streamonecloud.net\/embed\/*" + ], + "url": "https:\/\/content.streamonecloud.net\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Sutori", + "provider_url": "https:\/\/www.sutori.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.sutori.com\/story\/*" + ], + "url": "https:\/\/www.sutori.com\/api\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Sway", + "provider_url": "https:\/\/www.sway.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/sway.com\/*", + "https:\/\/www.sway.com\/*" + ], + "url": "https:\/\/sway.com\/api\/v1.0\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Ted", + "provider_url": "https:\/\/ted.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/ted.com\/talks\/*", + "https:\/\/ted.com\/talks\/*", + "https:\/\/www.ted.com\/talks\/*" + ], + "url": "https:\/\/www.ted.com\/talks\/oembed.{format}" + } + ] + }, + { + "provider_name": "The New York Times", + "provider_url": "https:\/\/www.nytimes.com", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.nytimes.com\/svc\/oembed", + "https:\/\/nytimes.com\/*", + "https:\/\/*.nytimes.com\/*" + ], + "url": "https:\/\/www.nytimes.com\/svc\/oembed\/json\/", + "discovery": true + } + ] + }, + { + "provider_name": "They Said So", + "provider_url": "https:\/\/theysaidso.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/theysaidso.com\/image\/*" + ], + "url": "https:\/\/theysaidso.com\/extensions\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "TickCounter", + "provider_url": "https:\/\/www.tickcounter.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.tickcounter.com\/countdown\/*", + "http:\/\/www.tickcounter.com\/countup\/*", + "http:\/\/www.tickcounter.com\/ticker\/*", + "http:\/\/www.tickcounter.com\/worldclock\/*", + "https:\/\/www.tickcounter.com\/countdown\/*", + "https:\/\/www.tickcounter.com\/countup\/*", + "https:\/\/www.tickcounter.com\/ticker\/*", + "https:\/\/www.tickcounter.com\/worldclock\/*" + ], + "url": "https:\/\/www.tickcounter.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Toornament", + "provider_url": "https:\/\/www.toornament.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.toornament.com\/tournaments\/*\/information", + "https:\/\/www.toornament.com\/tournaments\/*\/registration\/", + "https:\/\/www.toornament.com\/tournaments\/*\/matches\/schedule", + "https:\/\/www.toornament.com\/tournaments\/*\/stages\/*\/" + ], + "url": "https:\/\/widget.toornament.com\/oembed", + "discovery": true, + "formats": [ + "json", + "xml" + ] + } + ] + }, + { + "provider_name": "Topy", + "provider_url": "http:\/\/www.topy.se\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.topy.se\/image\/*" + ], + "url": "http:\/\/www.topy.se\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Tuxx", + "provider_url": "https:\/\/www.tuxx.be\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.tuxx.be\/*" + ], + "url": "https:\/\/www.tuxx.be\/services\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "tvcf", + "provider_url": "http:\/\/tvcf.co.kr", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.tvcf.co.kr\/v\/*" + ], + "url": "http:\/\/www.tvcf.co.kr\/services\/oembed" + } + ] + }, + { + "provider_name": "Twitch", + "provider_url": "https:\/\/www.twitch.tv", + "endpoints": [ + { + "schemes": [ + "http:\/\/clips.twitch.tv\/*", + "https:\/\/clips.twitch.tv\/*", + "http:\/\/www.twitch.tv\/*", + "https:\/\/www.twitch.tv\/*", + "http:\/\/twitch.tv\/*", + "https:\/\/twitch.tv\/*" + ], + "url": "https:\/\/api.twitch.tv\/v4\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Twitter", + "provider_url": "http:\/\/www.twitter.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/twitter.com\/*\/status\/*", + "https:\/\/*.twitter.com\/*\/status\/*" + ], + "url": "https:\/\/publish.twitter.com\/oembed" + } + ] + }, + { + "provider_name": "TypeCast", + "provider_url": "https:\/\/typecast.ai", + "endpoints": [ + { + "schemes": [ + "https:\/\/play.typecast.ai\/s\/*", + "https:\/\/play.typecast.ai\/e\/*", + "https:\/\/play.typecast.ai\/*" + ], + "url": "https:\/\/play.typecast.ai\/oembed" + } + ] + }, + { + "provider_name": "Ubideo", + "provider_url": "https:\/\/player.ubideo.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/player.ubideo.com\/*" + ], + "url": "https:\/\/player.ubideo.com\/api\/oembed.json", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "University of Cambridge Map", + "provider_url": "https:\/\/map.cam.ac.uk", + "endpoints": [ + { + "schemes": [ + "https:\/\/map.cam.ac.uk\/*" + ], + "url": "https:\/\/map.cam.ac.uk\/oembed\/" + } + ] + }, + { + "provider_name": "UOL", + "provider_url": "https:\/\/mais.uol.com.br\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.uol.com.br\/view\/*", + "https:\/\/*.uol.com.br\/video\/*" + ], + "url": "https:\/\/mais.uol.com.br\/apiuol\/v3\/oembed\/view", + "discovery": true + } + ] + }, + { + "provider_name": "Ustream", + "provider_url": "http:\/\/www.ustream.tv", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.ustream.tv\/*", + "http:\/\/*.ustream.com\/*" + ], + "url": "http:\/\/www.ustream.tv\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Utposts", + "provider_url": "https:\/\/www.utposts.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/www.utposts.com\/products\/*", + "http:\/\/www.utposts.com\/products\/*", + "https:\/\/utposts.com\/products\/*", + "http:\/\/utposts.com\/products\/*" + ], + "url": "https:\/\/www.utposts.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Uttles", + "provider_url": "http:\/\/uttles.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/uttles.com\/uttle\/*" + ], + "url": "http:\/\/uttles.com\/api\/reply\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "VeeR VR", + "provider_url": "http:\/\/veer.tv\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/veer.tv\/videos\/*" + ], + "url": "https:\/\/api.veer.tv\/oembed", + "discovery": true + }, + { + "schemes": [ + "http:\/\/veervr.tv\/videos\/*" + ], + "url": "https:\/\/api.veervr.tv\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Verse", + "provider_url": "http:\/\/verse.com\/", + "endpoints": [ + { + "url": "http:\/\/verse.com\/services\/oembed\/" + } + ] + }, + { + "provider_name": "VEVO", + "provider_url": "http:\/\/www.vevo.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.vevo.com\/*", + "https:\/\/www.vevo.com\/*" + ], + "url": "https:\/\/www.vevo.com\/oembed", + "discovery": false + } + ] + }, + { + "provider_name": "VideoJug", + "provider_url": "http:\/\/www.videojug.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/www.videojug.com\/film\/*", + "http:\/\/www.videojug.com\/interview\/*" + ], + "url": "http:\/\/www.videojug.com\/oembed.{format}" + } + ] + }, + { + "provider_name": "Vidlit", + "provider_url": "https:\/\/vidl.it\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vidl.it\/*" + ], + "url": "https:\/\/api.vidl.it\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vidmizer", + "provider_url": "https:\/\/www.vidmizer.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/players.vidmizer.com\/*" + ], + "url": "https:\/\/app-v2.vidmizer.com\/api\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vidyard", + "provider_url": "http:\/\/www.vidyard.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/embed.vidyard.com\/*", + "http:\/\/play.vidyard.com\/*", + "http:\/\/share.vidyard.com\/*", + "http:\/\/*.hubs.vidyard.com\/*" + ], + "url": "https:\/\/api.vidyard.com\/dashboard\/v1.1\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Vimeo", + "provider_url": "https:\/\/vimeo.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vimeo.com\/*", + "https:\/\/vimeo.com\/album\/*\/video\/*", + "https:\/\/vimeo.com\/channels\/*\/*", + "https:\/\/vimeo.com\/groups\/*\/videos\/*", + "https:\/\/vimeo.com\/ondemand\/*\/*", + "https:\/\/player.vimeo.com\/video\/*" + ], + "url": "https:\/\/vimeo.com\/api\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Viziosphere", + "provider_url": "http:\/\/www.viziosphere.com", + "endpoints": [ + { + "schemes": [ + "http:\/\/viziosphere.com\/3dphoto*" + ], + "url": "http:\/\/viziosphere.com\/services\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Vlipsy", + "provider_url": "https:\/\/vlipsy.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/vlipsy.com\/*" + ], + "url": "https:\/\/vlipsy.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "VLIVE", + "provider_url": "https:\/\/www.vlive.tv", + "endpoints": [ + { + "url": "https:\/\/www.vlive.tv\/oembed", + "schemes": [ + "https:\/\/www.vlive.tv\/video\/*" + ], + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "Vlurb", + "provider_url": "https:\/\/www.vlurb.co\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/vlurb.co\/video\/*", + "https:\/\/vlurb.co\/video\/*" + ], + "url": "https:\/\/vlurb.co\/oembed.json", + "discovery": true + } + ] + }, + { + "provider_name": "VoxSnap", + "provider_url": "https:\/\/voxsnap.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/article.voxsnap.com\/*\/*" + ], + "url": "https:\/\/data.voxsnap.com\/oembed", + "discovery": true, + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "wecandeo", + "provider_url": "http:\/\/www.wecandeo.com\/", + "endpoints": [ + { + "url": "http:\/\/play.wecandeo.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "Wiredrive", + "provider_url": "https:\/\/www.wiredrive.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.wiredrive.com\/*" + ], + "url": "http:\/\/*.wiredrive.com\/present-oembed\/", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "Wistia, Inc.", + "provider_url": "https:\/\/wistia.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/fast.wistia.com\/embed\/iframe\/*", + "https:\/\/fast.wistia.com\/embed\/playlists\/*", + "https:\/\/*.wistia.com\/medias\/*" + ], + "url": "https:\/\/fast.wistia.com\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "wizer.me", + "provider_url": "http:\/\/www.wizer.me\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.wizer.me\/learn\/*", + "https:\/\/*.wizer.me\/learn\/*", + "http:\/\/*.wizer.me\/preview\/*", + "https:\/\/*.wizer.me\/preview\/*" + ], + "url": "http:\/\/app.wizer.me\/api\/oembed.{format}", + "discovery": true + } + ] + }, + { + "provider_name": "Wootled", + "provider_url": "http:\/\/www.wootled.com\/", + "endpoints": [ + { + "url": "http:\/\/www.wootled.com\/oembed" + } + ] + }, + { + "provider_name": "WordPress.com", + "provider_url": "http:\/\/wordpress.com\/", + "endpoints": [ + { + "url": "http:\/\/public-api.wordpress.com\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "Yes, I Know IT!", + "provider_url": "http:\/\/yesik.it", + "endpoints": [ + { + "schemes": [ + "http:\/\/yesik.it\/*", + "http:\/\/www.yesik.it\/*" + ], + "url": "http:\/\/yesik.it\/s\/oembed", + "formats": [ + "json" + ], + "discovery": true + } + ] + }, + { + "provider_name": "YFrog", + "provider_url": "http:\/\/yfrog.com\/", + "endpoints": [ + { + "schemes": [ + "http:\/\/*.yfrog.com\/*", + "http:\/\/yfrog.us\/*" + ], + "url": "http:\/\/www.yfrog.com\/api\/oembed", + "formats": [ + "json" + ] + } + ] + }, + { + "provider_name": "YouTube", + "provider_url": "https:\/\/www.youtube.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.youtube.com\/watch*", + "https:\/\/*.youtube.com\/v\/*", + "https:\/\/youtu.be\/*" + ], + "url": "https:\/\/www.youtube.com\/oembed", + "discovery": true + } + ] + }, + { + "provider_name": "ZnipeTV", + "provider_url": "https:\/\/www.znipe.tv\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/*.znipe.tv\/*" + ], + "url": "https:\/\/api.znipe.tv\/v3\/oembed\/", + "discovery": true + } + ] + }, + { + "provider_name": "ZProvider", + "provider_url": "https:\/\/reports.zoho.com\/", + "endpoints": [ + { + "schemes": [ + "https:\/\/reports.zoho.com\/ZDBDataSheetView.cc?OBJID=1432535000000003002&STANDALONE=true&INTERVAL=120&DATATYPESYMBOL=false&REMTOOLBAR=false&SEARCHBOX=true&INCLUDETITLE=true&INCLUDEDESC=true&SHOWHIDEOPT=true" + ], + "url": "http:\/\/api.provider.com\/oembed.json", + "discovery": true + } + ] + } +] \ No newline at end of file diff --git a/backend/src/schema/resolvers/embeds/scraper.js b/backend/src/schema/resolvers/embeds/scraper.js new file mode 100644 index 000000000..607f7aeb9 --- /dev/null +++ b/backend/src/schema/resolvers/embeds/scraper.js @@ -0,0 +1,102 @@ +import Metascraper from 'metascraper' +import fetch from 'node-fetch' +import fs from 'fs' +import path from 'path' + +import { ApolloError } from 'apollo-server' +import isEmpty from 'lodash/isEmpty' +import isArray from 'lodash/isArray' +import mergeWith from 'lodash/mergeWith' + +const error = require('debug')('embed:error') + +const metascraper = 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-clearbit-logo')(), + 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')() +]) + +let oEmbedProvidersFile = fs.readFileSync(path.join(__dirname, './providers.json'), 'utf8') + +// some providers allow a format parameter +// we need JSON +oEmbedProvidersFile = oEmbedProvidersFile.replace('{format}', 'json') + +const oEmbedProviders = JSON.parse(oEmbedProvidersFile) + +const fetchEmbed = async url => { + const provider = oEmbedProviders.find(provider => { + return provider.provider_url.includes(url.hostname) + }) + if (!provider) return {} + const { + endpoints: [endpoint], + } = provider + const endpointUrl = new URL(endpoint.url) + endpointUrl.searchParams.append('url', url.href) + endpointUrl.searchParams.append('format', 'json') + let json + try { + const response = await fetch(endpointUrl) + json = await response.json() + } catch (err) { + error(`Error fetching embed data: ${err.message}`) + return {} + } + + return { + type: json.type, + html: json.html, + author: json.author_name, + date: json.upload_date, + sources: ['oembed'], + } +} + +const fetchResource = async url => { + const response = await fetch(url) + const html = await response.text() + const resource = await metascraper({ html, url: url.href }) + return { + sources: ['resource'], + ...resource, + } +} + +export default async function scrape(url) { + url = new URL(url) + if (url.hostname === 'youtu.be') { + // replace youtu.be to get proper results + url.hostname = 'youtube.com' + } + + const [meta, embed] = await Promise.all([fetchResource(url), fetchEmbed(url)]) + const output = mergeWith(meta, embed, (objValue, srcValue) => { + if (isArray(objValue)) { + return objValue.concat(srcValue) + } + }) + + if (isEmpty(output)) { + throw new ApolloError('Not found', 'NOT_FOUND') + } + + return { + type: 'link', + ...output, + } +} diff --git a/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.js index 415eb6f21..88d82846a 100644 --- a/backend/src/schema/resolvers/passwordReset.js +++ b/backend/src/schema/resolvers/passwordReset.js @@ -5,7 +5,7 @@ export async function createPasswordReset(options) { const { driver, code, email, issuedAt = new Date() } = options const session = driver.session() const cypher = ` - MATCH (u:User) WHERE u.email = $email + MATCH (u:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email:$email}) CREATE(pr:PasswordReset {code: $code, issuedAt: datetime($issuedAt), usedAt: NULL}) MERGE (u)-[:REQUESTED]->(pr) RETURN u @@ -35,7 +35,7 @@ export default { const encryptedNewPassword = await bcrypt.hashSync(newPassword, 10) const cypher = ` MATCH (pr:PasswordReset {code: $code}) - MATCH (u:User {email: $email})-[:REQUESTED]->(pr) + MATCH (e:EmailAddress {email: $email})<-[:PRIMARY_EMAIL]-(u:User)-[:REQUESTED]->(pr) WHERE duration.between(pr.issuedAt, datetime()).days <= 0 AND pr.usedAt IS NULL SET pr.usedAt = datetime() SET u.encryptedPassword = $encryptedNewPassword diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index 2e5069de7..233be450a 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -18,10 +18,11 @@ const createPostWithCategoriesMutation = ` mutation($title: String!, $content: String!, $categoryIds: [ID]) { CreatePost(title: $title, content: $content, categoryIds: $categoryIds) { id + title } } ` -const creatPostWithCategoriesVariables = { +const createPostWithCategoriesVariables = { title: postTitle, content: postContent, categoryIds: ['cat9', 'cat4', 'cat15'], @@ -35,6 +36,26 @@ const postQueryWithCategories = ` } } ` +const createPostWithoutCategoriesVariables = { + title: 'This is a post without categories', + content: 'I should be able to filter it out', + categoryIds: null, +} +const postQueryFilteredByCategory = ` +query Post($filter: _PostFilter) { + Post(filter: $filter) { + title + id + categories { + id + } + } + } +` +const postCategoriesFilterParam = { categories_some: { id_in: ['cat4'] } } +const postQueryFilteredByCategoryVariables = { + filter: postCategoriesFilterParam, +} beforeEach(async () => { userParams = { name: 'TestUser', @@ -133,7 +154,8 @@ describe('CreatePost', () => { }) describe('categories', () => { - it('allows a user to set the categories of the post', async () => { + let postWithCategories + beforeEach(async () => { await Promise.all([ factory.create('Category', { id: 'cat9', @@ -151,18 +173,39 @@ describe('CreatePost', () => { icon: 'shopping-cart', }), ]) - const expected = [{ id: 'cat9' }, { id: 'cat4' }, { id: 'cat15' }] - const postWithCategories = await client.request( + postWithCategories = await client.request( createPostWithCategoriesMutation, - creatPostWithCategoriesVariables, + createPostWithCategoriesVariables, ) + }) + + it('allows a user to set the categories of the post', async () => { + const expected = [{ id: 'cat9' }, { id: 'cat4' }, { id: 'cat15' }] const postQueryWithCategoriesVariables = { id: postWithCategories.CreatePost.id, } + await expect( client.request(postQueryWithCategories, postQueryWithCategoriesVariables), ).resolves.toEqual({ Post: [{ categories: expect.arrayContaining(expected) }] }) }) + + it('allows a user to filter for posts by category', async () => { + await client.request(createPostWithCategoriesMutation, createPostWithoutCategoriesVariables) + const categoryIds = [{ id: 'cat4' }, { id: 'cat15' }, { id: 'cat9' }] + const expected = { + Post: [ + { + title: postTitle, + id: postWithCategories.CreatePost.id, + categories: expect.arrayContaining(categoryIds), + }, + ], + } + await expect( + client.request(postQueryFilteredByCategory, postQueryFilteredByCategoryVariables), + ).resolves.toEqual(expected) + }) }) }) }) @@ -260,7 +303,7 @@ describe('UpdatePost', () => { ]) postWithCategories = await client.request( createPostWithCategoriesMutation, - creatPostWithCategoriesVariables, + createPostWithCategoriesVariables, ) updatePostVariables = { id: postWithCategories.CreatePost.id, diff --git a/backend/src/schema/resolvers/registration.js b/backend/src/schema/resolvers/registration.js index 3c8243d8a..20c54a49b 100644 --- a/backend/src/schema/resolvers/registration.js +++ b/backend/src/schema/resolvers/registration.js @@ -12,8 +12,8 @@ const instance = neode() */ 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.') + const emails = await instance.all('EmailAddress', { email }) + if (emails.length > 0) throw new UserInputError('User account with this email already exists.') } export default { diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js index 2cbce9a36..dc2e96348 100644 --- a/backend/src/schema/resolvers/registration.spec.js +++ b/backend/src/schema/resolvers/registration.spec.js @@ -166,11 +166,12 @@ describe('SignupByInvitation', () => { await expect(action()).rejects.toThrow('"email" must be a valid email') }) - it('creates no EmailAddress node', async done => { + it('creates no additional EmailAddress node', async done => { try { await action() } catch (e) { - const emailAddresses = await instance.all('EmailAddress') + let emailAddresses = await instance.all('EmailAddress') + emailAddresses = await emailAddresses.toJson expect(emailAddresses).toHaveLength(0) done() } @@ -191,16 +192,16 @@ describe('SignupByInvitation', () => { 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() + let emailAddress = await instance.first('EmailAddress', { email: 'someuser@example.org' }) + emailAddress = await emailAddress.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() + let emailAddress = await instance.first('EmailAddress', { email: 'someuser@example.org' }) + emailAddress = await emailAddress.toJson() expect(emailAddress.nonce).toEqual(expect.any(String)) }) @@ -220,6 +221,7 @@ describe('SignupByInvitation', () => { it('rejects because codes can be used only once', async done => { await action() try { + variables.email = 'yetanotheremail@example.org' await action() } catch (e) { expect(e.message).toMatch(/Invitation code already used/) @@ -282,8 +284,8 @@ describe('Signup', () => { it('creates a Signup with a cryptographic `nonce`', async () => { await action() - const emailAddresses = await instance.all('EmailAddress') - const emailAddress = await emailAddresses.first().toJson() + let emailAddress = await instance.first('EmailAddress', { email: 'someuser@example.org' }) + emailAddress = await emailAddress.toJson() expect(emailAddress.nonce).toEqual(expect.any(String)) }) }) diff --git a/backend/src/schema/resolvers/rewards.js b/backend/src/schema/resolvers/rewards.js index ec5043da3..f7a759aa4 100644 --- a/backend/src/schema/resolvers/rewards.js +++ b/backend/src/schema/resolvers/rewards.js @@ -1,47 +1,47 @@ +import { neode } from '../../bootstrap/neo4j' +import { UserInputError } from 'apollo-server' + +const instance = neode() + +const getUserAndBadge = async ({ badgeKey, userId }) => { + let user = await instance.first('User', 'id', userId) + const badge = await instance.first('Badge', 'id', badgeKey) + if (!user) throw new UserInputError("Couldn't find a user with that id") + if (!badge) throw new UserInputError("Couldn't find a badge with that id") + return { user, badge } +} + export default { Mutation: { reward: async (_object, params, context, _resolveInfo) => { - const { fromBadgeId, toUserId } = params - const session = context.driver.session() - - let transactionRes = await session.run( - `MATCH (badge:Badge {id: $badgeId}), (rewardedUser:User {id: $rewardedUserId}) - MERGE (badge)-[:REWARDED]->(rewardedUser) - RETURN rewardedUser {.id}`, - { - badgeId: fromBadgeId, - rewardedUserId: toUserId, - }, - ) - - const [rewardedUser] = transactionRes.records.map(record => { - return record.get('rewardedUser') - }) - - session.close() - - return rewardedUser.id + const { user, badge } = await getUserAndBadge(params) + await user.relateTo(badge, 'rewarded') + return user.toJson() }, unreward: async (_object, params, context, _resolveInfo) => { - const { fromBadgeId, toUserId } = params + const { badgeKey, userId } = params + const { user } = await getUserAndBadge(params) const session = context.driver.session() - - let transactionRes = await session.run( - `MATCH (badge:Badge {id: $badgeId})-[reward:REWARDED]->(rewardedUser:User {id: $rewardedUserId}) - DELETE reward - RETURN rewardedUser {.id}`, - { - badgeId: fromBadgeId, - rewardedUserId: toUserId, - }, - ) - const [rewardedUser] = transactionRes.records.map(record => { - return record.get('rewardedUser') - }) - session.close() - - return rewardedUser.id + try { + // silly neode cannot remove relationships + await session.run( + ` + MATCH (badge:Badge {id: $badgeKey})-[reward:REWARDED]->(rewardedUser:User {id: $userId}) + DELETE reward + RETURN rewardedUser + `, + { + badgeKey, + userId, + }, + ) + } catch (err) { + throw err + } finally { + session.close() + } + return user.toJson() }, }, } diff --git a/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.js index 2bdd9a39b..3b94e93aa 100644 --- a/backend/src/schema/resolvers/rewards.spec.js +++ b/backend/src/schema/resolvers/rewards.spec.js @@ -1,12 +1,19 @@ import { GraphQLClient } from 'graphql-request' import Factory from '../../seed/factories' -import { host, login } from '../../jest/helpers' +import { host, login, gql } from '../../jest/helpers' const factory = Factory() +let user +let badge describe('rewards', () => { + const variables = { + from: 'indiegogo_en_rhino', + to: 'u1', + } + beforeEach(async () => { - await factory.create('User', { + user = await factory.create('User', { id: 'u1', role: 'user', email: 'user@example.org', @@ -22,9 +29,8 @@ describe('rewards', () => { role: 'admin', email: 'admin@example.org', }) - await factory.create('Badge', { - id: 'b6', - key: 'indiegogo_en_rhino', + badge = await factory.create('Badge', { + id: 'indiegogo_en_rhino', type: 'crowdfunding', status: 'permanent', icon: '/img/badges/indiegogo_en_rhino.svg', @@ -35,21 +41,19 @@ describe('rewards', () => { await factory.cleanDatabase() }) - describe('RewardBadge', () => { - const mutation = ` - mutation( - $from: ID! - $to: ID! - ) { - reward(fromBadgeId: $from, toUserId: $to) + describe('reward', () => { + const mutation = gql` + mutation($from: ID!, $to: ID!) { + reward(badgeKey: $from, userId: $to) { + id + badges { + id + } + } } ` describe('unauthenticated', () => { - const variables = { - from: 'b6', - to: 'u1', - } let client it('throws authorization error', async () => { @@ -65,74 +69,95 @@ describe('rewards', () => { client = new GraphQLClient(host, { headers }) }) + describe('badge for id does not exist', () => { + it('rejects with a telling error message', async () => { + await expect( + client.request(mutation, { + ...variables, + from: 'bullshit', + }), + ).rejects.toThrow("Couldn't find a badge with that id") + }) + }) + + describe('user for id does not exist', () => { + it('rejects with a telling error message', async () => { + await expect( + client.request(mutation, { + ...variables, + to: 'bullshit', + }), + ).rejects.toThrow("Couldn't find a user with that id") + }) + }) + it('rewards a badge to user', async () => { - const variables = { - from: 'b6', - to: 'u1', - } const expected = { - reward: 'u1', + reward: { + id: 'u1', + badges: [{ id: 'indiegogo_en_rhino' }], + }, } await expect(client.request(mutation, variables)).resolves.toEqual(expected) }) + it('rewards a second different badge to same user', async () => { await factory.create('Badge', { - id: 'b1', - key: 'indiegogo_en_racoon', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_racoon', icon: '/img/badges/indiegogo_en_racoon.svg', }) - const variables = { - from: 'b1', - to: 'u1', - } + const badges = [{ id: 'indiegogo_en_racoon' }, { id: 'indiegogo_en_rhino' }] const expected = { - reward: 'u1', + reward: { + id: 'u1', + badges: expect.arrayContaining(badges), + }, } - await expect(client.request(mutation, variables)).resolves.toEqual(expected) + await client.request(mutation, variables) + await expect( + client.request(mutation, { + ...variables, + from: 'indiegogo_en_racoon', + }), + ).resolves.toEqual(expected) }) + it('rewards the same badge as well to another user', async () => { - const variables1 = { - from: 'b6', - to: 'u1', - } - await client.request(mutation, variables1) - - const variables2 = { - from: 'b6', - to: 'u2', - } const expected = { - reward: 'u2', + reward: { + id: 'u2', + badges: [{ id: 'indiegogo_en_rhino' }], + }, } - await expect(client.request(mutation, variables2)).resolves.toEqual(expected) + await expect( + client.request(mutation, { + ...variables, + to: 'u2', + }), + ).resolves.toEqual(expected) }) - it('returns the original reward if a reward is attempted a second time', async () => { - const variables = { - from: 'b6', - to: 'u1', - } + + it('creates no duplicate reward relationships', async () => { await client.request(mutation, variables) await client.request(mutation, variables) - const query = `{ - User( id: "u1" ) { - badgesCount + const query = gql` + { + User(id: "u1") { + badgesCount + badges { + id + } + } } - } ` - const expected = { User: [{ badgesCount: 1 }] } + const expected = { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] } await expect(client.request(query)).resolves.toEqual(expected) }) }) describe('authenticated moderator', () => { - const variables = { - from: 'b6', - to: 'u1', - } let client beforeEach(async () => { const headers = await login({ email: 'moderator@example.org', password: '1234' }) @@ -147,27 +172,41 @@ describe('rewards', () => { }) }) - describe('RemoveReward', () => { + describe('unreward', () => { beforeEach(async () => { - await factory.relate('User', 'Badges', { from: 'b6', to: 'u1' }) + await user.relateTo(badge, 'rewarded') }) - const variables = { - from: 'b6', - to: 'u1', - } - const expected = { - unreward: 'u1', - } + const expected = { unreward: { id: 'u1', badges: [] } } - const mutation = ` - mutation( - $from: ID! - $to: ID! - ) { - unreward(fromBadgeId: $from, toUserId: $to) + const mutation = gql` + mutation($from: ID!, $to: ID!) { + unreward(badgeKey: $from, userId: $to) { + id + badges { + id + } + } } ` + describe('check test setup', () => { + it('user has one badge', async () => { + const query = gql` + { + User(id: "u1") { + badgesCount + badges { + id + } + } + } + ` + const expected = { User: [{ badgesCount: 1, badges: [{ id: 'indiegogo_en_rhino' }] }] } + const client = new GraphQLClient(host) + await expect(client.request(query)).resolves.toEqual(expected) + }) + }) + describe('unauthenticated', () => { let client @@ -188,12 +227,9 @@ describe('rewards', () => { await expect(client.request(mutation, variables)).resolves.toEqual(expected) }) - it('fails to remove a not existing badge from user', async () => { + it('does not crash when unrewarding multiple times', async () => { await client.request(mutation, variables) - - await expect(client.request(mutation, variables)).rejects.toThrow( - "Cannot read property 'id' of undefined", - ) + await expect(client.request(mutation, variables)).resolves.toEqual(expected) }) }) diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js index bacc86fbe..7ec35a08f 100644 --- a/backend/src/schema/resolvers/socialMedia.spec.js +++ b/backend/src/schema/resolvers/socialMedia.spec.js @@ -1,7 +1,6 @@ -import gql from 'graphql-tag' import { GraphQLClient } from 'graphql-request' import Factory from '../../seed/factories' -import { host, login } from '../../jest/helpers' +import { host, login, gql } from '../../jest/helpers' const factory = Factory() diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js index b62f9a609..7ed84586b 100644 --- a/backend/src/schema/resolvers/user_management.js +++ b/backend/src/schema/resolvers/user_management.js @@ -2,6 +2,9 @@ import encode from '../../jwt/encode' import bcrypt from 'bcryptjs' import { AuthenticationError } from 'apollo-server' import { neo4jgraphql } from 'neo4j-graphql-js' +import { neode } from '../../bootstrap/neo4j' + +const instance = neode() export default { Query: { @@ -21,8 +24,8 @@ export default { // } const session = driver.session() const result = await session.run( - 'MATCH (user:User {email: $userEmail}) ' + - 'RETURN user {.id, .slug, .name, .avatar, .email, .encryptedPassword, .role, .disabled} as user LIMIT 1', + 'MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail})' + + 'RETURN user {.id, .slug, .name, .avatar, .encryptedPassword, .role, .disabled, email:e.email} as user LIMIT 1', { userEmail: email, }, @@ -46,41 +49,24 @@ export default { } }, changePassword: async (_, { oldPassword, newPassword }, { driver, user }) => { - const session = driver.session() - let result = await session.run( - `MATCH (user:User {email: $userEmail}) - RETURN user {.id, .email, .encryptedPassword}`, - { - userEmail: user.email, - }, - ) + let currentUser = await instance.find('User', user.id) - const [currentUser] = result.records.map(function(record) { - return record.get('user') - }) - - if (!(await bcrypt.compareSync(oldPassword, currentUser.encryptedPassword))) { + const encryptedPassword = currentUser.get('encryptedPassword') + if (!(await bcrypt.compareSync(oldPassword, encryptedPassword))) { throw new AuthenticationError('Old password is not correct') } - if (await bcrypt.compareSync(newPassword, currentUser.encryptedPassword)) { + if (await bcrypt.compareSync(newPassword, encryptedPassword)) { throw new AuthenticationError('Old password and new password should be different') - } else { - const newEncryptedPassword = await bcrypt.hashSync(newPassword, 10) - session.run( - `MATCH (user:User {email: $userEmail}) - SET user.encryptedPassword = $newEncryptedPassword - RETURN user - `, - { - userEmail: user.email, - newEncryptedPassword, - }, - ) - session.close() - - return encode(currentUser) } + + const newEncryptedPassword = await bcrypt.hashSync(newPassword, 10) + await currentUser.update({ + encryptedPassword: newEncryptedPassword, + updatedAt: new Date().toISOString(), + }) + + return encode(await currentUser.toJson()) }, }, } diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 2d9282b60..610f84ae1 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -2,6 +2,7 @@ import { neo4jgraphql } from 'neo4j-graphql-js' import fileUpload from './fileUpload' import { neode } from '../../bootstrap/neo4j' import { UserInputError } from 'apollo-server' +import { undefinedToNull } from '../helpers' const instance = neode() @@ -36,16 +37,6 @@ const count = obj => { 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)) { @@ -65,6 +56,13 @@ export const hasOne = obj => { export default { Query: { User: async (object, args, context, resolveInfo) => { + const { email } = args + if (email) { + const e = await instance.first('EmailAddress', { email }) + let user = e.get('belongsTo') + user = await user.toJson() + return [user.node] + } return neo4jgraphql(object, args, context, resolveInfo, false) }, }, @@ -104,6 +102,14 @@ export default { }, }, User: { + email: async (parent, params, context, resolveInfo) => { + if (typeof parent.email !== 'undefined') return parent.email + const { id } = parent + const statement = `MATCH(u:User {id: {id}})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` + const result = await instance.cypher(statement, { id }) + let [{ email }] = result.records.map(r => r.get('e').properties) + return email + }, ...undefinedToNull([ 'actorId', 'avatar', @@ -139,7 +145,7 @@ export default { organizationsCreated: '-[:CREATED_ORGA]->(related:Organization)', organizationsOwned: '-[:OWNING_ORGA]->(related:Organization)', categories: '-[:CATEGORIZED]->(related:Category)', - badges: '-[:REWARDED]->(related:Badge)', + badges: '<-[:REWARDED]-(related:Badge)', }), }, } diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index 6f9b6dd3d..fff6acadb 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -1,7 +1,6 @@ import { GraphQLClient } from 'graphql-request' -import { login, host } from '../../jest/helpers' import Factory from '../../seed/factories' -import gql from 'graphql-tag' +import { host, login, gql } from '../../jest/helpers' const factory = Factory() let client @@ -147,7 +146,7 @@ describe('users', () => { } ` beforeEach(async () => { - asAuthor = await factory.create('User', { + await factory.create('User', { email: 'test@example.org', password: '1234', id: 'u343', @@ -191,6 +190,7 @@ describe('users', () => { describe('attempting to delete my own account', () => { let expectedResponse beforeEach(async () => { + asAuthor = Factory() await asAuthor.authenticateAs({ email: 'test@example.org', password: '1234', diff --git a/backend/src/schema/types/embed.gql b/backend/src/schema/types/embed.gql new file mode 100644 index 000000000..d59f696b2 --- /dev/null +++ b/backend/src/schema/types/embed.gql @@ -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 + html: String + sources: [String] +} + +type Query { + embed(url: String!): Embed +} diff --git a/backend/src/schema/types/enum/BadgeStatus.gql b/backend/src/schema/types/enum/BadgeStatus.gql deleted file mode 100644 index b109663b3..000000000 --- a/backend/src/schema/types/enum/BadgeStatus.gql +++ /dev/null @@ -1,4 +0,0 @@ -enum BadgeStatus { - permanent - temporary -} \ No newline at end of file diff --git a/backend/src/schema/types/enum/BadgeType.gql b/backend/src/schema/types/enum/BadgeType.gql deleted file mode 100644 index eccf2e661..000000000 --- a/backend/src/schema/types/enum/BadgeType.gql +++ /dev/null @@ -1,4 +0,0 @@ -enum BadgeType { - role - crowdfunding -} \ No newline at end of file diff --git a/backend/src/schema/types/schema.gql b/backend/src/schema/types/schema.gql index 261501600..492dd3966 100644 --- a/backend/src/schema/types/schema.gql +++ b/backend/src/schema/types/schema.gql @@ -28,8 +28,6 @@ type Mutation { report(id: ID!, description: String): Report disable(id: ID!): ID enable(id: ID!): ID - reward(fromBadgeId: ID!, toUserId: ID!): ID - unreward(fromBadgeId: ID!, toUserId: ID!): ID # Shout the given Type and ID shout(id: ID!, type: ShoutTypeEnum): Boolean! # Unshout the given Type and ID diff --git a/backend/src/schema/types/schema_full.gql_ b/backend/src/schema/types/schema_full.gql_ deleted file mode 100644 index a581d287c..000000000 --- a/backend/src/schema/types/schema_full.gql_ +++ /dev/null @@ -1,324 +0,0 @@ -scalar Upload - -type Query { - isLoggedIn: Boolean! - # Get the currently logged in User based on the given JWT Token - currentUser: User - # Get the latest Network Statistics - statistics: Statistics! - findPosts(filter: String!, limit: Int = 10): [Post]! @cypher( - statement: """ - CALL db.index.fulltext.queryNodes('full_text_search', $filter) - YIELD node as post, score - MATCH (post)<-[:WROTE]-(user:User) - WHERE score >= 0.2 - AND NOT user.deleted = true AND NOT user.disabled = true - AND NOT post.deleted = true AND NOT post.disabled = true - RETURN post - LIMIT $limit - """ - ) - CommentByPost(postId: ID!): [Comment]! -} - -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! - report(id: ID!, description: String): Report - disable(id: ID!): ID - enable(id: ID!): ID - reward(fromBadgeId: ID!, toUserId: ID!): ID - unreward(fromBadgeId: ID!, toUserId: ID!): ID - # Shout the given Type and ID - shout(id: ID!, type: ShoutTypeEnum): Boolean! - # Unshout the given Type and ID - unshout(id: ID!, type: ShoutTypeEnum): Boolean! - # Follow the given Type and ID - follow(id: ID!, type: FollowTypeEnum): Boolean! - # Unfollow the given Type and ID - unfollow(id: ID!, type: FollowTypeEnum): Boolean! -} - -type Statistics { - countUsers: Int! - countPosts: Int! - countComments: Int! - countNotifications: Int! - countOrganizations: Int! - countProjects: Int! - countInvites: Int! - countFollows: Int! - countShouts: Int! -} - -type Notification { - id: ID! - read: Boolean, - user: User @relation(name: "NOTIFIED", direction: "OUT") - post: Post @relation(name: "NOTIFIED", direction: "IN") - createdAt: String -} - -scalar Date -scalar Time -scalar DateTime - -enum VisibilityEnum { - public - friends - private -} - -enum UserGroupEnum { - admin - moderator - user -} - -type Location { - id: ID! - name: String! - nameEN: String - nameDE: String - nameFR: String - nameNL: String - nameIT: String - nameES: String - namePT: String - namePL: String - type: String! - lat: Float - lng: Float - parent: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") -} - -type User { - id: ID! - actorId: String - name: String - email: String! - slug: String - password: String! - avatar: String - avatarUpload: Upload - deleted: Boolean - disabled: Boolean - disabledBy: User @relation(name: "DISABLED", direction: "IN") - role: UserGroupEnum - publicKey: String - privateKey: String - - location: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") - locationName: String - about: String - socialMedia: [SocialMedia]! @relation(name: "OWNED", direction: "OUT") - - createdAt: String - updatedAt: String - - notifications(read: Boolean): [Notification]! @relation(name: "NOTIFIED", direction: "IN") - - friends: [User]! @relation(name: "FRIENDS", direction: "BOTH") - friendsCount: Int! @cypher(statement: "MATCH (this)<-[:FRIENDS]->(r:User) RETURN COUNT(DISTINCT r)") - - following: [User]! @relation(name: "FOLLOWS", direction: "OUT") - followingCount: Int! @cypher(statement: "MATCH (this)-[:FOLLOWS]->(r:User) RETURN COUNT(DISTINCT r)") - - followedBy: [User]! @relation(name: "FOLLOWS", direction: "IN") - followedByCount: Int! @cypher(statement: "MATCH (this)<-[:FOLLOWS]-(r:User) RETURN COUNT(DISTINCT r)") - - # Is the currently logged in user following that user? - followedByCurrentUser: Boolean! @cypher( - statement: """ - MATCH (this)<-[:FOLLOWS]-(u:User {id: $cypherParams.currentUserId}) - RETURN COUNT(u) >= 1 - """ - ) - - #contributions: [WrittenPost]! - #contributions2(first: Int = 10, offset: Int = 0): [WrittenPost2]! - # @cypher( - # statement: "MATCH (this)-[w:WROTE]->(p:Post) RETURN p as Post, w.timestamp as timestamp" - # ) - contributions: [Post]! @relation(name: "WROTE", direction: "OUT") - contributionsCount: Int! @cypher( - statement: """ - MATCH (this)-[:WROTE]->(r:Post) - WHERE (NOT exists(r.deleted) OR r.deleted = false) - AND (NOT exists(r.disabled) OR r.disabled = false) - RETURN COUNT(r) - """ - ) - - comments: [Comment]! @relation(name: "WROTE", direction: "OUT") - commentsCount: Int! @cypher(statement: "MATCH (this)-[:WROTE]->(r:Comment) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(r)") - - shouted: [Post]! @relation(name: "SHOUTED", direction: "OUT") - shoutedCount: Int! @cypher(statement: "MATCH (this)-[:SHOUTED]->(r:Post) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)") - - organizationsCreated: [Organization] @relation(name: "CREATED_ORGA", direction: "OUT") - organizationsOwned: [Organization] @relation(name: "OWNING_ORGA", direction: "OUT") - - blacklisted: [User]! @relation(name: "BLACKLISTED", direction: "OUT") - - categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT") - - badges: [Badge]! @relation(name: "REWARDED", direction: "IN") - badgesCount: Int! @cypher(statement: "MATCH (this)<-[:REWARDED]-(r:Badge) RETURN COUNT(r)") -} - -type Post { - id: ID! - activityId: String - objectId: String - author: User @relation(name: "WROTE", direction: "IN") - title: String! - slug: String - content: String! - contentExcerpt: String - image: String - imageUpload: Upload - visibility: VisibilityEnum - deleted: Boolean - disabled: Boolean - disabledBy: User @relation(name: "DISABLED", direction: "IN") - createdAt: String - updatedAt: String - - relatedContributions: [Post]! @cypher( - statement: """ - MATCH (this)-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post) - RETURN DISTINCT post - LIMIT 10 - """ - ) - - tags: [Tag]! @relation(name: "TAGGED", direction: "OUT") - categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT") - - comments: [Comment]! @relation(name: "COMMENTS", direction: "IN") - commentsCount: Int! @cypher(statement: "MATCH (this)<-[:COMMENTS]-(r:Comment) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(r)") - - shoutedBy: [User]! @relation(name: "SHOUTED", direction: "IN") - shoutedCount: Int! @cypher(statement: "MATCH (this)<-[:SHOUTED]-(r:User) WHERE NOT r.deleted = true AND NOT r.disabled = true RETURN COUNT(DISTINCT r)") - - # Has the currently logged in user shouted that post? - shoutedByCurrentUser: Boolean! @cypher( - statement: """ - MATCH (this)<-[:SHOUTED]-(u:User {id: $cypherParams.currentUserId}) - RETURN COUNT(u) >= 1 - """ - ) -} - -type Comment { - id: ID! - activityId: String - postId: ID - author: User @relation(name: "WROTE", direction: "IN") - content: String! - contentExcerpt: String - post: Post @relation(name: "COMMENTS", direction: "OUT") - createdAt: String - updatedAt: String - deleted: Boolean - disabled: Boolean - disabledBy: User @relation(name: "DISABLED", direction: "IN") -} - -type Report { - id: ID! - submitter: User @relation(name: "REPORTED", direction: "IN") - description: String - type: String! @cypher(statement: "MATCH (resource)<-[:REPORTED]-(this) RETURN labels(resource)[0]") - createdAt: String - comment: Comment @relation(name: "REPORTED", direction: "OUT") - post: Post @relation(name: "REPORTED", direction: "OUT") - user: User @relation(name: "REPORTED", direction: "OUT") -} - -type Category { - id: ID! - name: String! - slug: String - icon: String! - posts: [Post]! @relation(name: "CATEGORIZED", direction: "IN") - postCount: Int! @cypher(statement: "MATCH (this)<-[:CATEGORIZED]-(r:Post) RETURN COUNT(r)") -} - -type Badge { - id: ID! - key: String! - type: BadgeTypeEnum! - status: BadgeStatusEnum! - icon: String! - - rewarded: [User]! @relation(name: "REWARDED", direction: "OUT") -} - -enum BadgeTypeEnum { - role - crowdfunding -} -enum BadgeStatusEnum { - permanent - temporary -} -enum ShoutTypeEnum { - Post - Organization - Project -} -enum FollowTypeEnum { - User - Organization - Project -} - -type Reward { - id: ID! - user: User @relation(name: "REWARDED", direction: "IN") - rewarderId: ID - createdAt: String - badge: Badge @relation(name: "REWARDED", direction: "OUT") -} - -type Organization { - id: ID! - createdBy: User @relation(name: "CREATED_ORGA", direction: "IN") - ownedBy: [User] @relation(name: "OWNING_ORGA", direction: "IN") - name: String! - slug: String - description: String! - descriptionExcerpt: String - deleted: Boolean - disabled: Boolean - - tags: [Tag]! @relation(name: "TAGGED", direction: "OUT") - categories: [Category]! @relation(name: "CATEGORIZED", direction: "OUT") -} - -type Tag { - id: ID! - name: String! - taggedPosts: [Post]! @relation(name: "TAGGED", direction: "IN") - taggedOrganizations: [Organization]! @relation(name: "TAGGED", direction: "IN") - taggedCount: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p) RETURN COUNT(DISTINCT p)") - taggedCountUnique: Int! @cypher(statement: "MATCH (this)<-[:TAGGED]-(p)<-[:WROTE]-(u:User) RETURN COUNT(DISTINCT u)") - deleted: Boolean - disabled: Boolean -} - -type SharedInboxEndpoint { - id: ID! - uri: String -} - -type SocialMedia { - id: ID! - url: String - ownedBy: [User]! @relation(name: "OWNED", direction: "IN") -} - diff --git a/backend/src/schema/types/type/Badge.gql b/backend/src/schema/types/type/Badge.gql index 68c5d5707..99015a518 100644 --- a/backend/src/schema/types/type/Badge.gql +++ b/backend/src/schema/types/type/Badge.gql @@ -1,6 +1,5 @@ type Badge { id: ID! - key: String! type: BadgeType! status: BadgeStatus! icon: String! @@ -10,4 +9,23 @@ type Badge { updatedAt: String rewarded: [User]! @relation(name: "REWARDED", direction: "OUT") -} \ No newline at end of file +} + +enum BadgeStatus { + permanent + temporary +} + +enum BadgeType { + role + crowdfunding +} + +type Query { + Badge: [Badge] +} + +type Mutation { + reward(badgeKey: ID!, userId: ID!): User + unreward(badgeKey: ID!, userId: ID!): User +} diff --git a/backend/src/schema/types/type/Comment.gql b/backend/src/schema/types/type/Comment.gql index 441fba179..4abebcba6 100644 --- a/backend/src/schema/types/type/Comment.gql +++ b/backend/src/schema/types/type/Comment.gql @@ -24,7 +24,7 @@ type Mutation { ): Comment UpdateComment( id: ID! - content: String + content: String! contentExcerpt: String deleted: Boolean disabled: Boolean diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index e5c43aad4..81bf3e782 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -2,7 +2,7 @@ type User { id: ID! actorId: String name: String - email: String! + email: String! @cypher(statement: "MATCH (this)-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e.email") slug: String! avatar: String coverImg: String @@ -81,6 +81,9 @@ type User { input _UserFilter { AND: [_UserFilter!] OR: [_UserFilter!] + name_contains: String + about_contains: String + slug_contains: String id: ID id_not: ID id_in: [ID!] diff --git a/backend/src/seed/factories/badges.js b/backend/src/seed/factories/badges.js index 6414e9f36..5f0482460 100644 --- a/backend/src/seed/factories/badges.js +++ b/backend/src/seed/factories/badges.js @@ -1,28 +1,15 @@ -import uuid from 'uuid/v4' - -export default function(params) { - const { - id = uuid(), - key = '', - type = 'crowdfunding', - status = 'permanent', - icon = '/img/badges/indiegogo_en_panda.svg', - } = params - +export default function create() { return { - mutation: ` - mutation( - $id: ID - $key: String! - $type: BadgeType! - $status: BadgeStatus! - $icon: String! - ) { - CreateBadge(id: $id, key: $key, type: $type, status: $status, icon: $icon) { - id - } + factory: async ({ args, neodeInstance }) => { + const defaults = { + type: 'crowdfunding', + status: 'permanent', } - `, - variables: { id, key, type, status, icon }, + args = { + ...defaults, + ...args, + } + return neodeInstance.create('Badge', args) + }, } } diff --git a/backend/src/seed/factories/index.js b/backend/src/seed/factories/index.js index b2cf2de45..e841b0beb 100644 --- a/backend/src/seed/factories/index.js +++ b/backend/src/seed/factories/index.js @@ -73,6 +73,7 @@ export default function Factory(options = {}) { const { factory, mutation, variables } = this.factories[node](args) if (factory) { this.lastResponse = await factory({ args, neodeInstance }) + return this.lastResponse } else { this.lastResponse = await this.graphQLClient.request(mutation, variables) } diff --git a/backend/src/seed/factories/users.js b/backend/src/seed/factories/users.js index ffe8e7a39..af1699253 100644 --- a/backend/src/seed/factories/users.js +++ b/backend/src/seed/factories/users.js @@ -3,7 +3,7 @@ import uuid from 'uuid/v4' import encryptPassword from '../../helpers/encryptPassword' import slugify from 'slug' -export default function create(params) { +export default function create() { return { factory: async ({ args, neodeInstance }) => { const defaults = { @@ -22,7 +22,10 @@ export default function create(params) { } args = await encryptPassword(args) const user = await neodeInstance.create('User', args) - return user.toJson() + const email = await neodeInstance.create('EmailAddress', { email: args.email }) + await user.relateTo(email, 'primaryEmail') + await email.relateTo(user, 'belongsTo') + return user }, } } diff --git a/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js index 18eefb76f..8f693cfd3 100644 --- a/backend/src/seed/seed-db.js +++ b/backend/src/seed/seed-db.js @@ -5,52 +5,42 @@ import Factory from './factories' ;(async function() { try { const f = Factory() - await Promise.all([ + const [racoon, rabbit, wolf, bear, turtle, rhino] = await Promise.all([ f.create('Badge', { - id: 'b1', - key: 'indiegogo_en_racoon', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_racoon', icon: '/img/badges/indiegogo_en_racoon.svg', }), f.create('Badge', { - id: 'b2', - key: 'indiegogo_en_rabbit', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_rabbit', icon: '/img/badges/indiegogo_en_rabbit.svg', }), f.create('Badge', { - id: 'b3', - key: 'indiegogo_en_wolf', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_wolf', icon: '/img/badges/indiegogo_en_wolf.svg', }), f.create('Badge', { - id: 'b4', - key: 'indiegogo_en_bear', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_bear', icon: '/img/badges/indiegogo_en_bear.svg', }), f.create('Badge', { - id: 'b5', - key: 'indiegogo_en_turtle', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_turtle', icon: '/img/badges/indiegogo_en_turtle.svg', }), f.create('Badge', { - id: 'b6', - key: 'indiegogo_en_rhino', - type: 'crowdfunding', - status: 'permanent', + id: 'indiegogo_en_rhino', icon: '/img/badges/indiegogo_en_rhino.svg', }), ]) - await Promise.all([ + const [ + peterLustig, + bobDerBaumeister, + jennyRostock, + tick, // eslint-disable-line no-unused-vars + trick, // eslint-disable-line no-unused-vars + track, // eslint-disable-line no-unused-vars + dagobert, + ] = await Promise.all([ f.create('User', { id: 'u1', name: 'Peter Lustig', @@ -123,30 +113,16 @@ import Factory from './factories' ]) 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', - }), + peterLustig.relateTo(racoon, 'rewarded'), + peterLustig.relateTo(rhino, 'rewarded'), + peterLustig.relateTo(wolf, 'rewarded'), + bobDerBaumeister.relateTo(racoon, 'rewarded'), + bobDerBaumeister.relateTo(turtle, 'rewarded'), + jennyRostock.relateTo(bear, 'rewarded'), + dagobert.relateTo(rabbit, 'rewarded'), + ]) + + await Promise.all([ f.relate('User', 'Friends', { from: 'u1', to: 'u2', @@ -707,6 +683,13 @@ import Factory from './factories' to: 'o3', }), ]) + + await Promise.all( + [...Array(30).keys()].map(i => { + return f.create('User') + }), + ) + /* eslint-disable-next-line no-console */ console.log('Seeded Data...') process.exit(0) diff --git a/backend/src/server.js b/backend/src/server.js index 7692f0d2c..d58ecd277 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -1,6 +1,6 @@ import express from 'express' import helmet from 'helmet' -import { GraphQLServer } from 'graphql-yoga' +import { ApolloServer } from 'apollo-server-express' import CONFIG, { requiredConfigs } from './config' import mocks from './mocks' import middleware from './middleware' @@ -20,28 +20,30 @@ const driver = getDriver() const createServer = options => { const defaults = { - context: async ({ request }) => { - const user = await decode(driver, request.headers.authorization) + context: async ({ req }) => { + const user = await decode(driver, req.headers.authorization) return { driver, user, - req: request, + req, cypherParams: { currentUserId: user ? user.id : null, }, } }, - schema, + schema: middleware(schema), debug: CONFIG.DEBUG, tracing: CONFIG.DEBUG, - middlewares: middleware(schema), mocks: CONFIG.MOCKS ? mocks : false, } - const server = new GraphQLServer(Object.assign({}, defaults, options)) + const server = new ApolloServer(Object.assign({}, defaults, options)) - server.express.use(helmet()) - server.express.use(express.static('public')) - return server + const app = express() + app.use(helmet()) + app.use(express.static('public')) + server.applyMiddleware({ app, path: '/' }) + + return { server, app } } export default createServer diff --git a/backend/src/server.spec.js b/backend/src/server.spec.js new file mode 100644 index 000000000..6d4ef546d --- /dev/null +++ b/backend/src/server.spec.js @@ -0,0 +1,43 @@ +import { createTestClient } from 'apollo-server-testing' +import createServer from './server' + +/** + * This file is for demonstration purposes. It does not really test the + * `isLoggedIn` query but demonstrates how we can use `apollo-server-testing`. + * All we need to do is to get an instance of `ApolloServer` and maybe we want + * stub out `context` as shown below. + * + */ + +let user +let action +describe('isLoggedIn', () => { + beforeEach(() => { + action = async () => { + const { server } = createServer({ + context: () => { + return { + user, + } + }, + }) + const { query } = createTestClient(server) + + const isLoggedIn = `{ isLoggedIn }` + return query({ query: isLoggedIn }) + } + }) + + it('returns false', async () => { + const expected = expect.objectContaining({ data: { isLoggedIn: false } }) + await expect(action()).resolves.toEqual(expected) + }) + + describe('when authenticated', () => { + it('returns true', async () => { + user = { id: '123' } + const expected = expect.objectContaining({ data: { isLoggedIn: true } }) + await expect(action()).resolves.toEqual(expected) + }) + }) +}) diff --git a/backend/yarn.lock b/backend/yarn.lock index d34e05c38..b210239bc 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -9,21 +9,21 @@ dependencies: apollo-env "0.5.1" -"@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== +"@apollographql/graphql-playground-html@1.6.24": + version "1.6.24" + resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.24.tgz#3ce939cb127fb8aaa3ffc1e90dff9b8af9f2e3dc" + integrity sha512-8GqG48m1XqyXh4mIZrtB5xOhUwSsh1WsrrsaZQOEYYql3YN9DEu9OOSg0ILzXHZo/h2Q74777YE4YzlArQzQEQ== -"@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== +"@babel/cli@~7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.5.5.tgz#bdb6d9169e93e241a08f5f7b0265195bf38ef5ec" + integrity sha512-UHI+7pHv/tk9g6WXQKYz+kmXTI77YtuY3vqC59KIqcoWEjsJJSG6rAxKaLsgj3LDyadsPrCB929gVOKM6Hui0w== dependencies: commander "^2.8.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" glob "^7.0.0" - lodash "^4.17.11" + lodash "^4.17.13" mkdirp "^0.5.1" output-file-sync "^2.0.0" slash "^2.0.0" @@ -31,41 +31,41 @@ optionalDependencies: chokidar "^2.0.4" -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== dependencies: "@babel/highlight" "^7.0.0" -"@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== +"@babel/core@^7.1.0", "@babel/core@~7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.5.tgz#17b2686ef0d6bc58f963dddd68ab669755582c30" + integrity sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/helpers" "^7.5.4" - "@babel/parser" "^7.5.0" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" + "@babel/helpers" "^7.5.5" + "@babel/parser" "^7.5.5" "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@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== +"@babel/generator@^7.0.0", "@babel/generator@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf" + integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ== dependencies: - "@babel/types" "^7.5.0" + "@babel/types" "^7.5.5" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.13" source-map "^0.5.0" trim-right "^1.0.1" @@ -93,14 +93,14 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-define-map@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" - integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== +"@babel/helper-define-map@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" + integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.4" - lodash "^4.17.11" + "@babel/types" "^7.5.5" + lodash "^4.17.13" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" @@ -133,12 +133,12 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== +"@babel/helper-member-expression-to-functions@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" + integrity sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.5.5" "@babel/helper-module-imports@^7.0.0": version "7.0.0" @@ -208,25 +208,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" - integrity sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ== +"@babel/helper-replace-supers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" + integrity sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-member-expression-to-functions" "^7.5.5" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" - integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -260,14 +250,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@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== +"@babel/helpers@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e" + integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g== dependencies: "@babel/template" "^7.4.4" - "@babel/traverse" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/traverse" "^7.5.5" + "@babel/types" "^7.5.5" "@babel/highlight@^7.0.0": version "7.0.0" @@ -278,22 +268,22 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@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== +"@babel/node@~7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/node/-/node-7.5.5.tgz#5db48a3bcee64d9eda6474f2a0a55b235d0438b5" + integrity sha512-xsW6il+yY+lzXMsQuvIJNA7tU8ix/f4G6bDt4DrnCkVpsR6clk9XgEbp7QF+xGNDdoD7M7QYokCH83pm+UjD0w== dependencies: "@babel/polyfill" "^7.0.0" - "@babel/register" "^7.0.0" + "@babel/register" "^7.5.5" commander "^2.8.1" - lodash "^4.17.11" + lodash "^4.17.13" 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.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/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" + integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -320,10 +310,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@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== +"@babel/plugin-proposal-object-rest-spread@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" + integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -418,25 +408,25 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" - integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== +"@babel/plugin-transform-block-scoping@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce" + integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.11" + lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" - integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== +"@babel/plugin-transform-classes@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" + integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.4" + "@babel/helper-define-map" "^7.5.5" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-replace-supers" "^7.5.5" "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" @@ -557,13 +547,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== +"@babel/plugin-transform-object-super@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" + integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-replace-supers" "^7.5.5" "@babel/plugin-transform-parameters@^7.4.4": version "7.4.4" @@ -649,17 +639,17 @@ core-js "^2.5.7" regenerator-runtime "^0.12.0" -"@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== +"@babel/preset-env@~7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.5.tgz#bc470b53acaa48df4b8db24a570d6da1fef53c9a" + integrity sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A== 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.5.4" + "@babel/plugin-proposal-object-rest-spread" "^7.5.5" "@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" @@ -670,8 +660,8 @@ "@babel/plugin-transform-arrow-functions" "^7.2.0" "@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-block-scoping" "^7.5.5" + "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" "@babel/plugin-transform-destructuring" "^7.5.0" "@babel/plugin-transform-dotall-regex" "^7.4.4" @@ -687,7 +677,7 @@ "@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" - "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" "@babel/plugin-transform-property-literals" "^7.2.0" "@babel/plugin-transform-regenerator" "^7.4.5" @@ -698,21 +688,21 @@ "@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.5.0" + "@babel/types" "^7.5.5" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/register@^7.0.0", "@babel/register@~7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.4.4.tgz#370a68ba36f08f015a8b35d4864176c6b65d7a23" - integrity sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA== +"@babel/register@^7.5.5", "@babel/register@~7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.5.5.tgz#40fe0d474c8c8587b28d6ae18a03eddad3dac3c1" + integrity sha512-pdd5nNR+g2qDkXZlW1yRCWFlNrAn2PPdnZUB72zjX4l1Vv4fMRRLwyf+n/idFCLI1UgVGboUU8oVziwTBiyNKQ== dependencies: core-js "^3.0.0" find-cache-dir "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.13" mkdirp "^0.5.1" pirates "^4.0.0" source-map-support "^0.5.9" @@ -740,28 +730,28 @@ "@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.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== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb" + integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.5.0" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.5.5" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.5.0" - "@babel/types" "^7.5.0" + "@babel/parser" "^7.5.5" + "@babel/types" "^7.5.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.11" + lodash "^4.17.13" -"@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== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a" + integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw== dependencies: esutils "^2.0.2" - lodash "^4.17.11" + lodash "^4.17.13" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -787,7 +777,7 @@ resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.0.1.tgz#9712fa2ad124ac64668ab06ba847b1eaf83a03fd" integrity sha512-cctMYH5RLbElaUpZn3IJaUj9QNQD8iXDnl7xNY6KB1aFD2ciJrwpo3kvZowIT75uA+silJFDnSR2kGakALUymg== -"@hapi/joi@^15.1.0": +"@hapi/joi@^15.0.3", "@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== @@ -955,6 +945,66 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^12.0.9" +"@kamilkisiela/graphql-tools@4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@kamilkisiela/graphql-tools/-/graphql-tools-4.0.6.tgz#6dcf4d18bedaf34f6ab1d5bad2414e530d0875d1" + integrity sha512-IPWa+dOFCE4zaCsrJrAMp7yWXnfOZLNhqoMEOmn958WkLM0mmsDc/W/Rh7/7xopIT6P0oizb6/N1iH5HnNXOUA== + dependencies: + apollo-link "^1.2.3" + apollo-utilities "^1.0.1" + deprecated-decorator "^0.1.6" + iterall "^1.1.3" + uuid "^3.1.0" + +"@metascraper/helpers@^4.10.2": + 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.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.22" + normalize-url "~4.2.0" + smartquotes "~2.3.1" + title "~3.4.1" + truncate "~2.0.1" + url-regex "~4.1.1" + video-extensions "~1.1.0" + +"@metascraper/helpers@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.6.3.tgz#88d3d3a174f94ccb617145cb9f60c999b57d9b60" + integrity sha512-FWqQmh+sZI5JRxJHVPPzBjilgZCqKWDFSo/eqRIgLLW/5kB79uuX4aseSTep1JpXUAcD5F/Z0KZYQl4JTbTopA== + dependencies: + audio-extensions "0.0.0" + chrono-node "~1.3.11" + condense-whitespace "~2.0.0" + entities "~2.0.0" + file-extension "~4.0.5" + has-values "~2.0.1" + 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.15" + mem "~5.1.1" + 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" @@ -1008,6 +1058,18 @@ 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.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" + "@types/accepts@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" @@ -1084,7 +1146,7 @@ "@types/node" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@4.17.0", "@types/express@^4.11.1": +"@types/express@*", "@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== @@ -1093,15 +1155,14 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" -"@types/graphql-deduplicator@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/graphql-deduplicator/-/graphql-deduplicator-2.0.0.tgz#9e577b8f3feb3d067b0ca756f4a1fb356d533922" - integrity sha512-swUwj5hWF1yFzbUXStLJrUa0ksAt11B8+SwhsAjQAX0LYJ1LLioAyuDcJ9bovWbsNzIXJYXLvljSPQw8nR728w== - -"@types/graphql@^14.0.0": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-14.0.3.tgz#389e2e5b83ecdb376d9f98fae2094297bc112c1c" - integrity sha512-TcFkpEjcQK7w8OcrQcd7iIBPjU0rdyi3ldj6d0iJ4PPSzbWqPBvXj9KSwO14hTOX2dm9RoiH7VuxksJLNYdXUQ== +"@types/glob@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" "@types/istanbul-lib-coverage@*": version "2.0.1" @@ -1128,6 +1189,11 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + "@types/long@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" @@ -1138,6 +1204,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA== +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "@types/node@*", "@types/node@^10.1.0": version "10.12.18" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" @@ -1174,21 +1245,33 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0" integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA== -"@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" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.5.4.tgz#b863a4191e525206819e008097ebf0fb2e3a1cdc" - integrity sha512-sW6xN96wUak4tgc89d0tbTg7QDGYhGv5hvQIS6h4mRCd8h2btiZ80loPU8cyLwsBbA4ZeQt0FjvUhJ4rNhdsGg== +"@types/yup@0.26.22": + version "0.26.22" + resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.22.tgz#66da181bfddaf797192f5fc2795583e033568407" + integrity sha512-AhUPifCc7j2BEfp+wye3Mj7v3mMhbtu5BbO7n0zpwC/NVSETc8+MHENRmoxjE8wLC8AmFr5+uEhg5cvqusaRFQ== "@types/zen-observable@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== +"@typescript-eslint/experimental-utils@^1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" + integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "1.13.0" + eslint-scope "^4.0.0" + +"@typescript-eslint/typescript-estree@1.13.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz#8140f17d0f60c03619798f1d628b8434913dc32e" + integrity sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + "@wry/context@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.0.tgz#8a8718408e4dd0514a0f8f4231bb4b87130b34e3" @@ -1281,6 +1364,22 @@ activitystreams-context@>=3.0.0, activitystreams-context@^3.0.0: resolved "https://registry.yarnpkg.com/activitystreams-context/-/activitystreams-context-3.1.0.tgz#28334e129f17cfb937e8c702c52c1bcb1d2830c7" integrity sha512-KBQ+igwf1tezMXGVw5MvRSEm0gp97JI1hTZ45I6MEkWv25lEgNoA9L6wqfaOiCX8wnMRWw9pwRsPZKypdtxAtg== +aggregate-error@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.0.tgz#5b5a3c95e9095f311c9ab16c19fb4f3527cd3f79" + integrity sha512-yKD9kEoJIR+2IFqhMwayIBgheLYbB3PS2OBhWae1L/ODTd/JF/30cW0bc9TqzRL3k4U41Dieu3BF4I29p8xesA== + dependencies: + clean-stack "^2.0.0" + indent-string "^3.2.0" + +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.10.0, ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" @@ -1323,7 +1422,12 @@ ansi-regex@^4.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.1.0, ansi-styles@^3.2.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== @@ -1343,20 +1447,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -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== +apollo-cache-control@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.8.0.tgz#08b157e5f8cd86f63608b05d45222de0725ebd5a" + integrity sha512-BBnfUmSWRws5dRSDD+R56RLJCE9v6xQuob+i/1Ju9EX4LZszU5JKVmxEvnkJ1bk/BkihjoQXTnP6fJCnt6fCmA== dependencies: apollo-server-env "2.4.0" - graphql-extensions "0.7.4" - -apollo-cache-control@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.1.1.tgz#173d14ceb3eb9e7cb53de7eb8b61bee6159d4171" - integrity sha512-XJQs167e9u+e5ybSi51nGYr70NPBbswdvTEHtbtXbwkZ+n9t0SLPvUcoqceayOSwjK1XYOdU/EKPawNdb3rLQA== - dependencies: - graphql-extensions "^0.0.x" + graphql-extensions "0.8.0" apollo-cache-inmemory@~1.6.2: version "1.6.2" @@ -1391,32 +1488,32 @@ apollo-client@~2.6.3: tslib "^1.9.3" zen-observable "^0.8.0" -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== +apollo-datasource@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.6.0.tgz#823d6be8a3804613b5c56d2972c07db662293fc6" + integrity sha512-DOzzYWEOReYRu2vWPKEulqlTb9Xjg67sjVCzve5MXa7GUXjfr8IKioljvfoBMlqm/PpbJVk2ci4n5NIFqoYsrQ== dependencies: - apollo-server-caching "0.4.0" + apollo-server-caching "0.5.0" apollo-server-env "2.4.0" -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== +apollo-engine-reporting-protobuf@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.4.0.tgz#e34c192d86493b33a73181fd6be75721559111ec" + integrity sha512-cXHZSienkis8v4RhqB3YG3DkaksqLpcxApRLTpRMs7IXNozgV7CUPYGFyFBEra1ZFgUyHXx4G9MpelV+n2cCfA== dependencies: protobufjs "^6.8.6" -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== +apollo-engine-reporting@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.0.tgz#3a9bd011b271593e16d7057044898d0a817b197d" + integrity sha512-NMiO3h1cuEBt6QZNGHxivwuyZQnoU/2MMx0gUA8Gyy1ERBhK6P235qoMnvoi34rLmqJuyGPX6tXcab8MpMIzYQ== dependencies: - apollo-engine-reporting-protobuf "0.3.1" + apollo-engine-reporting-protobuf "0.4.0" apollo-graphql "^0.3.3" - apollo-server-core "2.6.7" apollo-server-env "2.4.0" + apollo-server-types "0.2.0" async-retry "^1.2.1" - graphql-extensions "0.7.6" + graphql-extensions "0.8.0" apollo-env@0.5.1: version "0.5.1" @@ -1479,31 +1576,33 @@ apollo-link@^1.0.0, apollo-link@^1.2.12, apollo-link@^1.2.3: tslib "^1.9.3" zen-observable-ts "^0.8.19" -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== +apollo-server-caching@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/apollo-server-caching/-/apollo-server-caching-0.5.0.tgz#446a37ce2d4e24c81833e276638330a634f7bd46" + integrity sha512-l7ieNCGxUaUAVAAp600HjbUJxVaxjJygtPV0tPTe1Q3HkPy6LEWoY6mNHV7T268g1hxtPTxcdRu7WLsJrg7ufw== dependencies: lru-cache "^5.0.0" -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== +apollo-server-core@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.7.0.tgz#c444347dea11149b5b453890506e43dc7e711257" + integrity sha512-CXjXAkgcMBCJZpsZgfAY5W7f5thdxUhn75UgzeH28RTUZ2aKi/LjoCixPWRSF1lU4vuEWneAnM8Vg/KCD+29lQ== dependencies: "@apollographql/apollo-tools" "^0.3.6" - "@apollographql/graphql-playground-html" "1.6.20" + "@apollographql/graphql-playground-html" "1.6.24" "@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-cache-control "0.8.0" + apollo-datasource "0.6.0" + apollo-engine-reporting "1.4.0" + apollo-engine-reporting-protobuf "0.4.0" + apollo-server-caching "0.5.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" + apollo-server-errors "2.3.1" + apollo-server-plugin-base "0.6.0" + apollo-server-types "0.2.0" + apollo-tracing "0.8.0" fast-json-stable-stringify "^2.0.0" - graphql-extensions "0.7.6" + graphql-extensions "0.8.0" graphql-subscriptions "^1.0.0" graphql-tag "^2.9.2" graphql-tools "^4.0.0" @@ -1512,41 +1611,6 @@ 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" - integrity sha512-BP1Vh39krgEjkQxbjTdBURUjLHbFq1zeOChDJgaRsMxGtlhzuLWwwC6lLdPatN8jEPbeHq8Tndp9QZ3iQZOKKA== - dependencies: - apollo-cache-control "^0.1.0" - apollo-tracing "^0.1.0" - graphql-extensions "^0.0.x" - 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" @@ -1555,102 +1619,71 @@ apollo-server-env@2.4.0: node-fetch "^2.1.2" util.promisify "^1.0.0" -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-errors@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.1.tgz#033cf331463ebb99a563f8354180b41ac6714eb6" + integrity sha512-errZvnh0vUQChecT7M4A/h94dnBSRL213dNxpM5ueMypaLYgnp4hiCTWIEaooo9E4yMGd1qA6WaNbLDG2+bjcg== -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== +apollo-server-express@2.7.0, apollo-server-express@^2.6.9: + version "2.7.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.7.0.tgz#c19bf56c32473a76b1eb87237d713018984f838e" + integrity sha512-TIOaLyuxD8xIECXjbPfS9HUWgHCKsG3rR4WuTpTreVEB08EsGeg+VcNGn0hmUnch18fPXTciBHWCv/fFV/YhMg== dependencies: - "@apollographql/graphql-playground-html" "1.6.20" + "@apollographql/graphql-playground-html" "1.6.24" "@types/accepts" "^1.3.5" "@types/body-parser" "1.17.0" "@types/cors" "^2.8.4" "@types/express" "4.17.0" accepts "^1.3.5" - apollo-server-core "2.6.8" + apollo-server-core "2.7.0" + apollo-server-types "0.2.0" 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-express@^1.3.6: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.4.0.tgz#7d7c58d6d6f9892b83fe575669093bb66738b125" - integrity sha512-zkH00nxhLnJfO0HgnNPBTfZw8qI5ILaPZ5TecMCI9+Y9Ssr2b0bFr9pBRsXy9eudPhI+/O4yqegSUsnLdF/CPw== +apollo-server-plugin-base@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.6.0.tgz#4186296ea5d52cfe613961d252a8a2f9e13e6ba6" + integrity sha512-BjfyWpHyKwHOe819gk3wEFwbnVp9Xvos03lkkYTTcXS/8G7xO78aUcE65mmyAC56/ZQ0aodNFkFrhwNtWBQWUQ== dependencies: - apollo-server-core "^1.4.0" - apollo-server-module-graphiql "^1.4.0" + apollo-server-types "0.2.0" -apollo-server-lambda@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/apollo-server-lambda/-/apollo-server-lambda-1.3.6.tgz#bdaac37f143c6798e40b8ae75580ba673cea260e" - integrity sha1-varDfxQ8Z5jkC4rnVYC6ZzzqJg4= +apollo-server-testing@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.7.0.tgz#df8f8fb0df85f9781b6822fc92ee36fdc039b024" + integrity sha512-geBTK5T8mqZ2UOscC3oHQ/QoKMINLK+Mmq5ZfZe9UhmdXi+WqQ3/6B+3HMoQ7eQ7D6bNILe8b7N2EKuyUkePdg== dependencies: - apollo-server-core "^1.3.6" - apollo-server-module-graphiql "^1.3.4" + apollo-server-core "2.7.0" -apollo-server-module-graphiql@^1.3.4, apollo-server-module-graphiql@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.4.0.tgz#c559efa285578820709f1769bb85d3b3eed3d8ec" - integrity sha512-GmkOcb5he2x5gat+TuiTvabnBf1m4jzdecal3XbXBh/Jg+kx4hcvO3TTDFQ9CuTprtzdcVyA11iqG7iOMOt7vA== - -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-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-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== +apollo-server-types@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.2.0.tgz#270d7298f709fd8237ebfa48753249e5286df5f2" + integrity sha512-5dgiyXsM90vnfmdXO1ixHvsLn0d9NP4tWufmr3ZmjKv00r4JAQNUaUdgOSGbRIKoHELQGwxUuTySTZ/tYfGaNQ== dependencies: - apollo-server-core "2.6.8" + apollo-engine-reporting-protobuf "0.4.0" + apollo-server-caching "0.5.0" + apollo-server-env "2.4.0" -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== +apollo-server@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.7.0.tgz#6a326f06ed1c5cc4e57e1731b74ec92c79237889" + integrity sha512-UKYROQqcwSgIjUEjaxAllRJQFTa3flPY+fV5Q0Kz2e3XE5QomEkuNBmO54IefIOr8LllhRU9246WmMHRuwun+w== dependencies: - apollo-server-core "2.6.8" - apollo-server-express "2.6.8" + apollo-server-core "2.7.0" + apollo-server-express "2.7.0" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" -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== +apollo-tracing@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.8.0.tgz#28cd9c61a4db12b2c24dad67fdedd309806c1650" + integrity sha512-cNOtOlyZ56iJRsCjnxjM1V0SnQ2ZZttuyoeOejdat6llPfk5bfYTVOKMjdbSfDvU33LS9g9sqNJCT0MwrEPFKQ== dependencies: apollo-server-env "2.4.0" - graphql-extensions "0.7.4" - -apollo-tracing@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.4.tgz#5b8ae1b01526b160ee6e552a7f131923a9aedcc7" - integrity sha512-Uv+1nh5AsNmC3m130i2u3IqbS+nrxyVV3KYimH5QKsdPjxxIQB3JAT+jJmpeDxBel8gDVstNmCh82QSLxLSIdQ== - dependencies: - graphql-extensions "~0.0.9" - -apollo-upload-server@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/apollo-upload-server/-/apollo-upload-server-7.1.0.tgz#21e07b52252b3749b913468599813e13cfca805f" - integrity sha512-cD9ReCeyurYwZyEDqJYb5TOc9dt8yhPzS+MtrY3iJdqw+pqiiyPngAvVXHjN+Ca7Lajvom4/AT/PBrYVDMM3Kw== - dependencies: - busboy "^0.2.14" - fs-capacitor "^1.0.0" - http-errors "^1.7.0" - object-path "^0.11.4" + graphql-extensions "0.8.0" apollo-utilities@1.3.2, apollo-utilities@^1.0.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.2: version "1.3.2" @@ -1667,6 +1700,11 @@ aproba@^1.0.3: 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" @@ -1675,6 +1713,11 @@ are-we-there-yet@~1.1.2: 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== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1832,34 +1875,20 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +asyncro@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/asyncro/-/asyncro-3.0.0.tgz#3c7a732e263bc4a42499042f48d7d858e9c0134e" + integrity sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg== + 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== -aws-lambda@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/aws-lambda/-/aws-lambda-0.1.2.tgz#19b1585075df31679597b976a5f1def61f12ccee" - integrity sha1-GbFYUHXfMWeVl7l2pfHe9h8SzO4= - dependencies: - aws-sdk "^*" - commander "^2.5.0" - dotenv "^0.4.0" - -aws-sdk@^*: - version "2.373.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.373.0.tgz#fcc5606634b3b11d80810ad252d1b52b3733d780" - integrity sha512-NZYXwXGtFt9jxaKXc+PJsLPnpbD03t0MAZRxh93g36kbFMuRXtY8CDqHYNQ0ZcrgQpXbCQiz1fxT5/wu5Cu70g== - dependencies: - buffer "4.9.1" - events "1.1.1" - ieee754 "1.1.8" - jmespath "0.15.0" - querystring "0.2.0" - sax "1.2.1" - url "0.10.3" - uuid "3.1.0" - xml2js "0.4.19" +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" @@ -1950,11 +1979,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== - base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2023,14 +2047,7 @@ bn.js@^2.0.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU= -body-parser-graphql@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/body-parser-graphql/-/body-parser-graphql-1.1.0.tgz#80a80353c7cb623562fd375750dfe018d75f0f7c" - integrity sha512-bOBF4n1AnUjcY1SzLeibeIx4XOuYqEkjn/Lm4yKhnN6KedoXMv4hVqgcKHGRnxOMJP64tErqrQU+4cihhpbJXg== - dependencies: - body-parser "^1.18.2" - -body-parser@1.19.0, body-parser@^1.18.2, body-parser@^1.18.3: +body-parser@1.19.0, body-parser@^1.18.3: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -2141,28 +2158,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -busboy@^0.2.14: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= - dependencies: - dicer "0.2.5" - readable-stream "1.1.x" - busboy@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" @@ -2190,6 +2190,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + callsites@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" @@ -2243,6 +2256,15 @@ chai@~4.2.0: pathval "^1.1.0" type-detect "^4.0.5" +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.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2262,7 +2284,12 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -cheerio@~1.0.0-rc.3: +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, cheerio@~1.0.0-rc.3: version "1.0.0-rc.3" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== @@ -2298,6 +2325,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" + ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -2318,6 +2352,21 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +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.1.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.1.0.tgz#9e7fec7f3f8340a2ab4f127c80273085e8fbbdd0" + integrity sha512-uQWrpRm+iZZUCAp7ZZJQbd4Za9I3AjR/3YTjmcnAtkauaIm/T5CT6U8zVI6e60T6OANqBFAzuR9/HB3NzuZCRA== + +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" @@ -2345,6 +2394,14 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +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" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -2354,6 +2411,13 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.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" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2364,6 +2428,11 @@ code-point-at@^1.0.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.5" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.5.tgz#c2495b699ab1ed380d29a1091e01063e75dbbe3a" + integrity sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2396,7 +2465,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.5.0, commander@^2.8.1, commander@^2.9.0: +commander@^2.8.1, commander@^2.9.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== @@ -2428,6 +2497,16 @@ concat-map@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= + +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" @@ -2508,17 +2587,12 @@ core-js-pure@3.1.2: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.2.tgz#62fc435f35b7374b9b782013cdcb2f97e9f6dffa" integrity sha512-5ckIdBF26B3ldK9PM177y2ZcATP2oweam9RskHSoqfZCrJ2As6wVg8zJ1zTriFsZf6clj/N1ThDFRGaomMsh9w== -core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.7: - version "2.6.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" - integrity sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g== +core-js@^2.4.0, core-js@^2.5.7, core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -core-js@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0.tgz#a8dbfa978d29bfc263bfb66c556d0ca924c28957" - integrity sha512-WBmxlgH2122EzEJ6GH8o9L/FeoUKxxxZ6q6VUxoTlsE4EvbTWKJb447eyVxTEuq0LpXjlq/kCB2qgBvsYRkLvQ== - -core-js@^3.0.1: +core-js@^3.0.0, core-js@^3.0.1: version "3.1.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.3.tgz#95700bca5f248f5f78c0ec63e784eca663ec4138" integrity sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA== @@ -2559,6 +2633,14 @@ cross-fetch@2.2.2: node-fetch "2.1.2" whatwg-fetch "2.0.4" +cross-fetch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c" + integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw== + dependencies: + node-fetch "2.6.0" + whatwg-fetch "3.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" @@ -2686,10 +2768,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -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== +date-fns@2.0.0-beta.3: + version "2.0.0-beta.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.0.0-beta.3.tgz#2e28f5af945930f774ddd778e184d68227101d55" + integrity sha512-z5O262BvHPhwUvA1weXH+AZodygnZUcORERw8hjwBUrRPGrAo2e/rjXfC8Ykf1OGJZGDuLnK/WXbEZBIc0exGQ== 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" @@ -2722,6 +2804,13 @@ decode-uri-component@^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-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2739,12 +2828,17 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== +deepmerge@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.0.0.tgz#3e3110ca29205f120d7cb064960a39c3d2087c09" + integrity sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww== -define-properties@^1.1.2: +defer-to-connect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" + integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + +define-properties@^1.1.2, define-properties@^1.1.3: 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== @@ -2813,14 +2907,6 @@ detect-newline@^2.1.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= -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" - dicer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" @@ -2838,10 +2924,10 @@ diff@^3.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dns-prefetch-control@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" - integrity sha1-YN20V3dOF48flBXwyrsOhbCzALI= +dns-prefetch-control@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz#73988161841f3dcc81f47686d539a2c702c88624" + integrity sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q== doctrine@1.5.0: version "1.5.0" @@ -2901,10 +2987,10 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dont-sniff-mimetype@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" - integrity sha1-WTKJDcn04vGeXrAqIAJuXl78j1g= +dont-sniff-mimetype@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz#c7d0427f8bcb095762751252af59d148b0a623b2" + integrity sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug== dot-prop@^4.1.0: version "4.2.0" @@ -2913,11 +2999,6 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dotenv@^0.4.0: - version "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" @@ -2998,6 +3079,11 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3012,18 +3098,7 @@ error-stack-parser@^2.0.1: dependencies: stackframe "^1.0.4" -es-abstract@^1.4.3: - 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-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -3035,6 +3110,17 @@ es-abstract@^1.5.1, es-abstract@^1.7.0: is-regex "^1.0.4" object-keys "^1.0.12" +es-abstract@^1.4.3: + 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, es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -3143,10 +3229,10 @@ eslint-plugin-es@^1.4.0: eslint-utils "^1.3.0" regexpp "^2.0.1" -eslint-plugin-import@~2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz#7a5ba8d32622fb35eb9c8db195c2090bd18a3678" - integrity sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig== +eslint-plugin-import@~2.18.2: + version "2.18.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6" + integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ== dependencies: array-includes "^3.0.3" contains-path "^0.1.0" @@ -3155,15 +3241,17 @@ eslint-plugin-import@~2.18.0: eslint-import-resolver-node "^0.3.2" eslint-module-utils "^2.4.0" has "^1.0.3" - lodash "^4.17.11" minimatch "^3.0.4" + object.values "^1.1.0" read-pkg-up "^2.0.0" resolve "^1.11.0" -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-jest@~22.13.6: + version "22.13.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.13.6.tgz#85630e7709fe1ecbe0099956590af32d5e157448" + integrity sha512-wn3n9Djj+Dyi8AS1kvGOXpzUJfs9SJYhoZxIb49y4cwHRPaSgDHzSJPZX3sliZ3k8l6bYVeEGW76QvvqoOjSEw== + dependencies: + "@typescript-eslint/experimental-utils" "^1.13.0" eslint-plugin-node@~9.1.0: version "9.1.0" @@ -3202,7 +3290,7 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.3: +eslint-scope@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== @@ -3210,6 +3298,14 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-utils@^1.3.0, eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" @@ -3220,10 +3316,10 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@~6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7" - integrity sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w== +eslint@~6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" + integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.10.0" @@ -3231,7 +3327,7 @@ eslint@~6.0.1: cross-spawn "^6.0.5" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^4.0.3" + eslint-scope "^5.0.0" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" espree "^6.0.0" @@ -3239,28 +3335,29 @@ eslint@~6.0.1: esutils "^2.0.2" file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^3.1.0" + glob-parent "^5.0.0" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.2.2" + inquirer "^6.4.1" is-glob "^4.0.0" js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.11" + lodash "^4.17.14" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" progress "^2.0.0" regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" table "^5.2.3" text-table "^0.2.0" + v8-compile-cache "^2.0.3" espree@^6.0.0: version "6.0.0" @@ -3315,11 +3412,6 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== -events@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - exec-sh@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" @@ -3338,6 +3430,19 @@ execa@^0.7.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" + execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" @@ -3386,7 +3491,7 @@ expect@^24.8.0: jest-message-util "^24.8.0" jest-regex-util "^24.3.0" -express@^4.0.0, express@^4.16.3, express@~4.17.1: +express@^4.0.0, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -3530,6 +3635,11 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" +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" @@ -3636,16 +3746,18 @@ frameguard@3.1.0: resolved "https://registry.yarnpkg.com/frameguard/-/frameguard-3.1.0.tgz#bd1442cca1d67dc346a6751559b6d04502103a22" integrity sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g== +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-capacitor@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-2.0.4.tgz#5a22e72d40ae5078b4fe64fe4d08c0d3fc88ad3c" @@ -3710,6 +3822,11 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +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-stdin@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" @@ -3720,18 +3837,32 @@ get-stream@^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.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-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + 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.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/get-video-id/-/get-video-id-3.1.4.tgz#9bffb8b607aa0379f0f8a927eae7df13b5e414a3" + integrity sha512-XOZ60NZ60ozTtoWtPPpA3TC9JgDXgcd5nTfYwjBhZWAx3w48HRq6EqKp2bUJ/3F+BWgiMMHg4IkQ+acO6LxfMQ== + 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" @@ -3752,10 +3883,17 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob-parent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" + integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== + dependencies: + is-glob "^4.0.1" + +glob@7.1.4, glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3793,6 +3931,23 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.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" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" @@ -3822,34 +3977,16 @@ graphql-custom-directives@~0.2.14: moment "^2.22.2" numeral "^2.0.6" -graphql-deduplicator@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/graphql-deduplicator/-/graphql-deduplicator-2.0.2.tgz#d8608161cf6be97725e178df0c41f6a1f9f778f3" - integrity sha512-0CGmTmQh4UvJfsaTPppJAcHwHln8Ayat7yXXxdnuWT+Mb1dBzkbErabCWzjXyKh/RefqlGTTA7EQOZHofMaKJA== - -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== +graphql-extensions@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.8.0.tgz#b3fe7915aa84eef5a39135840840cc4d2e700c46" + integrity sha512-zV9RefkusIXqi9ZJtl7IJ5ecjDKdb7PLAb5E3CmxX3OK1GwNCIubp0vE7Fp4fXlCUKgTB1Woubs0zj71JT8o0A== dependencies: "@apollographql/apollo-tools" "^0.3.6" + apollo-server-env "2.4.0" + apollo-server-types "0.2.0" -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.3.6" - -graphql-extensions@^0.0.x, graphql-extensions@~0.0.9: - version "0.0.10" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.10.tgz#34bdb2546d43f6a5bc89ab23c295ec0466c6843d" - integrity sha512-TnQueqUDCYzOSrpQb3q1ngDSP2otJSF+9yNLrQGPzkMsvnQ+v6e2d5tl+B35D4y+XpmvVnAn4T3ZK28mkILveA== - dependencies: - core-js "^2.5.3" - source-map-support "^0.5.1" - -graphql-import@^0.7.0: +graphql-import@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223" integrity sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw== @@ -3862,32 +3999,13 @@ graphql-iso-date@~3.6.1: resolved "https://registry.yarnpkg.com/graphql-iso-date/-/graphql-iso-date-3.6.1.tgz#bd2d0dc886e0f954cbbbc496bbf1d480b57ffa96" integrity sha512-AwFGIuYMJQXOEAgRlJlFL4H1ncFM8n8XmoVDTNypNOZyQ8LFDG2ppMFlsS862BSTCDcSUfHp8PD3/uJhv7t59Q== -graphql-middleware@3.0.2, graphql-middleware@~3.0.2: +graphql-middleware@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/graphql-middleware/-/graphql-middleware-3.0.2.tgz#c8cdb67615eec02aec237b455e679f5fc973ddc4" integrity sha512-sRqu1sF+77z42z1OVM1QDHKQWnWY5K3nAgqWiZwx3U4tqNZprrDuXxSChPMliV343IrVkpYdejUYq9w24Ot3FA== dependencies: graphql-tools "^4.0.4" -graphql-playground-html@1.6.12: - version "1.6.12" - resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.12.tgz#8b3b34ab6013e2c877f0ceaae478fafc8ca91b85" - integrity sha512-yOYFwwSMBL0MwufeL8bkrNDgRE7eF/kTHiwrqn9FiR9KLcNIl1xw9l9a+6yIRZM56JReQOHpbQFXTZn1IuSKRg== - -graphql-playground-middleware-express@1.7.11: - version "1.7.11" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.11.tgz#bbffd784a37133bfa7165bdd8f429081dbf4bcf6" - integrity sha512-sKItB4s3FxqlwCgXdMfwRAfssSoo31bcFsGAAg/HzaZLicY6CDlofKXP8G5iPDerB6NaoAcAaBLutLzl9sd4fQ== - dependencies: - graphql-playground-html "1.6.12" - -graphql-playground-middleware-lambda@1.7.12: - version "1.7.12" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-lambda/-/graphql-playground-middleware-lambda-1.7.12.tgz#1b06440a288dbcd53f935b43e5b9ca2738a06305" - integrity sha512-fJ1Y0Ck5ctmfaQFoWv7vNnVP7We19P3miVmOT85YPrjpzbMYv0wPfxm4Zjt8nnqXr0KU9nGW53tz3K7/Lvzxtw== - dependencies: - graphql-playground-html "1.6.12" - graphql-request@~1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" @@ -3895,23 +4013,16 @@ graphql-request@~1.8.2: dependencies: cross-fetch "2.2.2" -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== +graphql-shield@~6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-6.0.4.tgz#f7c5b4e09ddcf5483ef7e653176b5d67d2a24518" + integrity sha512-0atSTooJcIcRv/qqIdhAkD8XPYCuwJqeAzoYwdLUp7LFmsSWK6wmHHmYSPcCscBZMI+8f2T0I8eA6yuv5SAvOA== dependencies: - "@types/yup" "0.26.21" + "@types/yup" "0.26.22" lightercollective "^0.3.0" object-hash "^1.3.1" yup "^0.27.0" -graphql-subscriptions@^0.5.8: - version "0.5.8" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7" - integrity sha512-0CaZnXKBw2pwnIbvmVckby5Ge5e2ecmjofhYCdyeACbCly2j3WXDP/pl+s+Dqd2GQFC7y99NB+53jrt55CKxYQ== - dependencies: - iterall "^1.2.1" - graphql-subscriptions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-1.0.0.tgz#475267694b3bd465af6477dbab4263a3f62702b8" @@ -3924,6 +4035,25 @@ graphql-tag@^2.9.2, graphql-tag@~2.10.1: resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.1.tgz#10aa41f1cd8fae5373eaf11f1f67260a3cad5e02" integrity sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg== +graphql-toolkit@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/graphql-toolkit/-/graphql-toolkit-0.4.1.tgz#f5a9fa225b51168dd0d0558dc59e8fc3d379e9b1" + integrity sha512-asTRlNn0381f6/wVp8F0X2vsz8GJnv4TX+KNHg1k8Ybe6Ii5HBreJTxBHJ7GXlNDhj5MGCNi09nt8Oe7Ategrg== + dependencies: + "@kamilkisiela/graphql-tools" "4.0.6" + "@types/glob" "7.1.1" + aggregate-error "3.0.0" + asyncro "^3.0.0" + cross-fetch "^3.0.4" + deepmerge "4.0.0" + glob "7.1.4" + graphql-import "0.7.1" + is-glob "4.0.1" + is-valid-path "0.1.1" + lodash "4.17.15" + tslib "^1.9.3" + valid-url "1.0.9" + graphql-tools@^4.0.0, graphql-tools@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.4.tgz#ca08a63454221fdde825fe45fbd315eb2a6d566b" @@ -3935,7 +4065,7 @@ graphql-tools@^4.0.0, graphql-tools@^4.0.4: iterall "^1.1.3" uuid "^3.1.0" -graphql-upload@^8.0.0, graphql-upload@^8.0.2: +graphql-upload@^8.0.2: version "8.0.7" resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-8.0.7.tgz#8644264e241529552ea4b3797e7ee15809cf01a3" integrity sha512-gi2yygbDPXbHPC7H0PNPqP++VKSoNoJO4UrXWq4T0Bi4IhyUd3Ycop/FSxhx2svWIK3jdXR/i0vi91yR1aAF0g== @@ -3945,35 +4075,7 @@ graphql-upload@^8.0.0, graphql-upload@^8.0.2: http-errors "^1.7.2" object-path "^0.11.4" -graphql-yoga@~1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-1.18.0.tgz#2668278e94a0bd1b2ff8c60f928c4e18d62e381a" - integrity sha512-WEibitQA2oFTmD7XBO8/ps8DWeVpkzOzgbB3EvtM2oIpyGhPCzRZYrC7OS9MmijvRwLRXsgHImHWUm82ZrIOWA== - dependencies: - "@types/cors" "^2.8.4" - "@types/express" "^4.11.1" - "@types/graphql" "^14.0.0" - "@types/graphql-deduplicator" "^2.0.0" - "@types/zen-observable" "^0.5.3" - apollo-server-express "^1.3.6" - apollo-server-lambda "1.3.6" - apollo-upload-server "^7.0.0" - aws-lambda "^0.1.2" - body-parser-graphql "1.1.0" - cors "^2.8.4" - express "^4.16.3" - graphql "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0" - graphql-deduplicator "^2.0.1" - graphql-import "^0.7.0" - graphql-middleware "3.0.2" - graphql-playground-middleware-express "1.7.11" - graphql-playground-middleware-lambda "1.7.12" - graphql-subscriptions "^0.5.8" - graphql-tools "^4.0.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.2: +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== @@ -4009,6 +4111,11 @@ har-validator@~5.1.0: 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" @@ -4055,6 +4162,13 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" +has-values@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d" + integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w== + dependencies: + kind-of "^6.0.2" + has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -4075,10 +4189,10 @@ he@0.5.0: resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" integrity sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI= -helmet-crossdomain@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.3.0.tgz#707e2df930f13ad61f76ed08e1bb51ab2b2e85fa" - integrity sha512-YiXhj0E35nC4Na5EPE4mTfoXMf9JTGpN4OtB4aLqShKuH9d2HNaJX5MQoglO6STVka0uMsHyG5lCut5Kzsy7Lg== +helmet-crossdomain@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz#5f1fe5a836d0325f1da0a78eaa5fd8429078894e" + integrity sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA== helmet-csp@2.7.1: version "2.7.1" @@ -4090,31 +4204,31 @@ helmet-csp@2.7.1: dasherize "2.0.0" platform "1.3.5" -helmet@~3.18.0: - version "3.18.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.18.0.tgz#37666f7c861bd1ff3015e0cdb903a43501e3da3e" - integrity sha512-TsKlGE5UVkV0NiQ4PllV9EVfZklPjyzcMEMjWlyI/8S6epqgRT+4s4GHVgc25x0TixsKvp3L7c91HQQt5l0+QA== +helmet@~3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.19.0.tgz#02c524dd69e03b0af20dce7bc9929ff951081a29" + integrity sha512-l58Q3unSpYatlurvFzkCbTRQ8oWUmdXbOs7h+pnwQbFJRhRJDjER6UMyqHxp9iFtWPcVA05VLcUGSi0EXIv7GA== dependencies: depd "2.0.0" - dns-prefetch-control "0.1.0" - dont-sniff-mimetype "1.0.0" + dns-prefetch-control "0.2.0" + dont-sniff-mimetype "1.1.0" expect-ct "0.2.0" feature-policy "0.3.0" frameguard "3.1.0" - helmet-crossdomain "0.3.0" + helmet-crossdomain "0.4.0" helmet-csp "2.7.1" - hide-powered-by "1.0.0" + hide-powered-by "1.1.0" hpkp "2.0.0" hsts "2.2.0" ienoopen "1.1.0" nocache "2.1.0" referrer-policy "1.2.0" - x-xss-protection "1.1.0" + x-xss-protection "1.2.0" -hide-powered-by@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" - integrity sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys= +hide-powered-by@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.1.0.tgz#be3ea9cab4bdb16f8744be873755ca663383fa7a" + integrity sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg== hoek@5.x.x: version "5.0.4" @@ -4169,6 +4283,11 @@ htmlparser2@^3.10.0, htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.0.6" +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + http-errors@1.7.2, http-errors@^1.7.2, http-errors@~1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -4180,17 +4299,6 @@ http-errors@1.7.2, http-errors@^1.7.2, http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" -http-errors@^1.7.0: - 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" @@ -4207,16 +4315,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= - -ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== - ienoopen@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974" @@ -4244,6 +4342,11 @@ ignore@^5.1.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.1.tgz#2fc6b8f518aff48fef65a7f348ed85632448e4a5" integrity sha512-DWjnQIFLenVrwyRCKZT+7a7/U4Cqgar4WG8V++K3hw+lrW1hc/SIwdiGmtxKCVACmHULTuGeBbHJmbwW7/sAvA== +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-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -4270,7 +4373,7 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.1.0: +indent-string@^3.0.0, indent-string@^3.1.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -4283,7 +4386,7 @@ inflight@^1.0.4: 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: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -4298,10 +4401,10 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== +inquirer@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -4309,12 +4412,12 @@ inquirer@^6.2.2: cli-width "^2.0.0" external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.11" + lodash "^4.17.12" mute-stream "0.0.7" run-async "^2.2.0" rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^5.0.0" + strip-ansi "^5.1.0" through "^2.3.6" insane@2.6.1: @@ -4337,11 +4440,31 @@ invert-kv@^2.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== +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= + +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.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +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-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" @@ -4448,6 +4571,11 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + 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" @@ -4475,6 +4603,20 @@ is-generator@^1.0.2: resolved "https://registry.yarnpkg.com/is-generator/-/is-generator-1.0.3.tgz#c14c21057ed36e328db80347966c693f886389f3" integrity sha1-wUwhBX7TbjKNuANHlmxpP4hjifM= +is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -4482,13 +4624,6 @@ is-glob@^3.1.0: 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" @@ -4497,6 +4632,13 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-invalid-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-invalid-path/-/is-invalid-path-0.1.0.tgz#307a855b3cf1a938b44ea70d2c61106053714f34" + integrity sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ= + dependencies: + is-glob "^2.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" @@ -4533,11 +4675,31 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-port-reachable@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-2.0.1.tgz#e0778d0733beac1ade3ba72a5fe77db50a59926b" + integrity sha512-SqU55C5gkitgOhl2ccd2v23MbkbcOFa5e4aPo8h8VGqOifh7iDwG44bQBWGW/lZulTjl9AWIKP0NiUWpa+TtWA== + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +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" @@ -4550,6 +4712,20 @@ is-regex@^1.0.4: 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-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" @@ -4572,16 +4748,26 @@ 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-valid-path@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-valid-path/-/is-valid-path-0.1.1.tgz#110f9ff74c37f663e1ec7915eb451f2db93ac9df" + integrity sha1-EQ+f90w39mPh7HkV60UfLbk6yd8= + dependencies: + is-invalid-path "^0.1.0" + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 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, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -4599,6 +4785,16 @@ isexe@^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== + +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" @@ -4611,6 +4807,11 @@ isobject@^3.0.0, isobject@^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" @@ -5018,12 +5219,7 @@ jest@~24.8.0: import-local "^2.0.0" jest-cli "^24.8.0" -jmespath@0.15.0: - version "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.7.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== @@ -5102,6 +5298,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +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-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -5214,6 +5415,13 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +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" @@ -5396,16 +5604,21 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash@4.17.15, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.11, lodash@~4.17.14, lodash@~4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + lodash@=3.10.1: version "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.14: - version "4.17.14" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" - integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== - long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -5423,11 +5636,16 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lowercase-keys@^1.0.0: +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== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -5457,7 +5675,7 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -map-age-cleaner@^0.1.1: +map-age-cleaner@^0.1.1, 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== @@ -5490,6 +5708,20 @@ mem@^4.0.0: mimic-fn "^1.0.0" p-is-promise "^2.0.0" +mem@~5.1.1: + 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" + +memoize-one@~5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.5.tgz#8cd3809555723a07684afafcd6f756072ac75d7e" + integrity sha512-ey6EpYv0tEaIbM/nTDOpHciXUvd+ackQrJgEzBwemhZZIWZjcyodqEcrmqDy2BKRTM3a65kKBV4WtLXJDt26SQ== + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -5500,14 +5732,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-graphql-schemas@^1.5.8: - version "1.5.8" - resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.5.8.tgz#89457b60312aabead44d5b2b7625643f8ab9e369" - integrity sha512-0TGOKebltvmWR9h9dPYS2vAqMPThXwJ6gVz7O5MtpBp2sunAg/M25iMSNI7YhU6PDJVtGtldTfqV9a+55YhB+A== +merge-graphql-schemas@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.6.1.tgz#4c4744bd3f2395a876d0e6885e60c90a9a5a4568" + integrity sha512-XEgol3ThgEPo65Cj+cx8UhOFE4IuTSF1Mh0iK8AVOEM/hKrhLfNECmtg9U6HoHfa9nINLxeGZIVvq9rjoSx3cQ== dependencies: - deepmerge "^2.2.1" - glob "^7.1.3" - is-glob "^4.0.0" + graphql-toolkit "0.4.1" + tslib "1.10.0" merge-stream@^1.0.1: version "1.0.1" @@ -5516,6 +5747,133 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +metascraper-audio@^5.5.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.6.3.tgz#f84f4e19960c698df2e14cd98212b004bac66bb9" + integrity sha512-XxO9iHVQzGa+Z7wzmnHl3dmFdBdmYfO/ozeMWH0fp/4YbU1GU3l+OlYzPaVhCEfArqzzuwf1iq8uGKdU/DOZnw== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-author@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.6.3.tgz#8ecc0d4257be1438e9f8242b4f0c1a5137f5bb13" + integrity sha512-BNnYWjaEFOS5JX5s6KFo6MIv5M2hgnaWV47LM/EOvfHpe0a6DovVtLkGrVj6SpbPio3tzTjakouBwjQpuo1Dlg== + dependencies: + "@metascraper/helpers" "^5.6.3" + lodash "~4.17.15" + +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.6.0" + +metascraper-date@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.6.3.tgz#516fad38391a45137a58430f639a57037eee96f2" + integrity sha512-sdbY0IOu1BcZHocwVIJ8/CPkguVR8oDho13apIGNsZjyItIdMMLrziDqzOSGcJI++AXGmS3MNHW8M+bdYHVj1g== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-description@^5.5.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.6.3.tgz#1abfde848e8002c606e5741b9523b61ca592bb34" + integrity sha512-ATfsUS6t912hSYKEOyVUX+GrwRMcUltOcvEXtD/5ER26z3h1ab83w4UvQ7imo9F6yueQX2dB6QfqTkWF92X6Vw== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-image@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.6.3.tgz#1d2fa627d90d5545f45bdda6e874af421ee1c622" + integrity sha512-pDq6fU6X59642KNmE1WmJUUgJxepU4TDj1u2HDR0XCdqeiEGpskqmO/rFJSdgRFJNFUo7RJ1Er8cT4yVKCgqtg== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-lang-detector@^4.8.5: + version "4.10.2" + resolved "https://registry.yarnpkg.com/metascraper-lang-detector/-/metascraper-lang-detector-4.10.2.tgz#45744bc331125c098e8b27716d76740161b121d2" + integrity sha512-Lz1d5v/i1j08gQYz7sCdoxjOx94ArLV4UucUhGZeQpR4E6dK47V6aqfYwODRe2XAqhaU+3oLnbAipoHkOeZXiw== + dependencies: + "@metascraper/helpers" "^4.10.2" + franc "~4.0.0" + iso-639-3 "~1.1.0" + +metascraper-lang@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.6.3.tgz#d2d7a20f4145b0785391fffec629e154737fc942" + integrity sha512-c13zxmREcB/hDXs7MIxio7RNfVsSzGfixk6FrfQQh3fypmiR84SpeZmQR+G/e2X/BDNwpIydJM62R7BayY709Q== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-logo@^5.5.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.6.3.tgz#bb18449e872815ba6199e2aa78078259c2677b98" + integrity sha512-xeqjSuTAiudXiUczj7F0+VvXdgFvL5rqyW3D+BPXrNHOUqDyyYNlHTEhambj3HbMP6EjQyoMDEvqCF5qUezmXg== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-publisher@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.6.3.tgz#3729cd7dac117c94f92020ff3a8397a1b965a27e" + integrity sha512-1Z+bwrTn6j4Tf85DatYL0zDmqBfoJCfYa0nNlZ9HWfjM+QWDxBeIu1v/85N3AYGYPwk5G38IdvEYBb4MpMEQvQ== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-soundcloud@^5.5.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.6.3.tgz#c2bb5904857d079a44c0d1e1511dfaf4d0f19945" + integrity sha512-v44pktX4I7pnUjThGs11YZLNpuQbuB6iY2RcYnODjasgor8t7ZHPwrJqy01b0mkTmHoRbQ84Vheq1SkAD0Vz8g== + dependencies: + "@metascraper/helpers" "^5.6.3" + memoize-one "~5.0.5" + tldts "~5.3.1" + +metascraper-title@^5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.6.3.tgz#219bf9a4da28d48ea180497a1d6d2b4fa4871cc2" + integrity sha512-sZ+SWojZhECisyw+el5fc1q2ENEAeQDzy/HabSkeA/saB3xqf3XnfqtCGIuElyxKiXS65KWzQOX+u3KseZdiAg== + dependencies: + "@metascraper/helpers" "^5.6.3" + lodash "~4.17.15" + +metascraper-url@^5.5.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.6.3.tgz#7e756f79ed2a5e1591682e29b665551855ddda5d" + integrity sha512-hFHff2AsWuW552CkktWR9ViVp2poZufP1YUAVJWRe7UaHC67vx2mE5hjNZkVBSi1rOoPIbNN+jPVvcKwT6tkAw== + dependencies: + "@metascraper/helpers" "^5.6.3" + +metascraper-video@^4.8.5: + version "4.10.2" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-4.10.2.tgz#6378f3ac6bf0a2e11a27096545464cf6a19e1e74" + integrity sha512-cM8Tq9j6sKUMJxomd0TP619khJrn89zh0A1T7HC9tjGvaF+RGdpjpBq8xbpPDrXbeqDl4BVTX9VQ4MDU3+UuQA== + dependencies: + "@metascraper/helpers" "^4.10.2" + lodash "~4.17.11" + +metascraper-youtube@^4.8.5: + version "4.10.2" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-4.10.2.tgz#d8bd437f90f2bf40c30613c0f4fb1f56c094119a" + integrity sha512-cmW0JOCVJUsspaBS3WFM8YvMKEG0sPtB21KjPTzRN9yhYyXYy63Pw21G/KxTEdth7GWxfnuttRtiD4BnfntApg== + dependencies: + "@metascraper/helpers" "^4.10.2" + get-video-id "~3.1.1" + is-reachable "~3.0.0" + p-locate "~4.0.0" + +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.10.2" + cheerio "~1.0.0-rc.2" + cheerio-advanced-selectors "~2.0.1" + lodash "~4.17.11" + p-reduce "~2.0.0" + whoops "~4.0.2" + methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5557,7 +5915,7 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "~1.37.0" -mime-types@~2.1.24: +mime-types@~2.1.22, 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== @@ -5574,6 +5932,21 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +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" + integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA== + +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== + minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5631,6 +6004,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.17.1: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" @@ -5665,6 +6043,11 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" +n-gram@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/n-gram/-/n-gram-1.1.1.tgz#a374dc176a9063a2388d1be18ed7c35828be2a97" + integrity sha512-qibRqvUghLIVsq+RTwVuwOzgOxf0l4DDZKVYAK0bMam5sG9ZzaJ6BUSJyG2Td8kTc7c/HcMUtjiN5ShobZA2bA== + n3@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/n3/-/n3-0.9.1.tgz#430b547d58dc7381408c45784dd8058171903932" @@ -5784,7 +6167,7 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@~2.6.0: +node-fetch@2.6.0, node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@~2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== @@ -5837,10 +6220,10 @@ node-releases@^1.1.19: dependencies: semver "^5.3.0" -nodemailer@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.2.1.tgz#20d773925eb8f7a06166a0b62c751dc8290429f3" - integrity sha512-TagB7iuIi9uyNgHExo8lUDq3VK5/B0BpbkcjIgNvxbtVrjNqq0DwAOTuzALPVkK76kMhTSzIgHqg8X1uklVs6g== +nodemailer@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.3.0.tgz#a89b0c62d3937bdcdeecbf55687bd7911b627e12" + integrity sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw== nodemon@~1.19.1: version "1.19.1" @@ -5895,6 +6278,16 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^4.1.0, 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== + +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" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -6033,6 +6426,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6117,6 +6520,18 @@ output-file-sync@^2.0.0: is-plain-obj "^1.1.0" mkdirp "^0.5.1" +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.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -6139,6 +6554,11 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== +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@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -6167,11 +6587,37 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.0.0.tgz#fff5d4a5dc4f89babe7d266f6efc685630038651" + integrity sha512-IvOiDT1hbCdrsFKKXs8AGjxouEfn9VVdz/edtT08IDr+RIn2U/o3Xx+Agx455+CkSRdomMs3EN5BgR2Q0LZX0g== + 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" + 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@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6226,6 +6672,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +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@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -6363,6 +6814,11 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +port-numbers@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/port-numbers/-/port-numbers-4.0.13.tgz#563b6c6947a92d6df7ad909b96a54de49703091b" + integrity sha512-Nu/yQsPdBZ+dsJFBs8zUZk4ZEY/yL1RN1LqnaRYWtlzALPLj7VLKh/MFUFQuzPOGZpsj9Mh5wL1gNJzWQGPKyQ== + 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" @@ -6387,6 +6843,11 @@ prepend-http@^1.0.1: 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= + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -6500,10 +6961,10 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +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@2.x.x, punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" @@ -6525,10 +6986,10 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== range-parser@~1.2.1: version "1.2.1" @@ -6614,16 +7075,6 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -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.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.3, readable-stream@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -6837,6 +7288,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +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-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -6871,6 +7327,13 @@ resolve@^1.10.1, resolve@^1.11.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0 dependencies: path-parse "^1.0.6" +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" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -6901,6 +7364,11 @@ rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.1.3" +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= + rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -6973,11 +7441,6 @@ sanitize-html@~1.20.1: srcset "^1.0.0" xtend "^4.0.1" -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o= - sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -7008,15 +7471,20 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^6.0.0, semver@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" - integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== send@0.17.1: version "0.17.1" @@ -7077,11 +7545,6 @@ set-value@^2.0.0: 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== - setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -7153,6 +7616,11 @@ slug@~1.1.0: dependencies: unicode ">= 0.3.1" +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" @@ -7194,7 +7662,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.1, source-map-support@^0.5.6, source-map-support@^0.5.9: +source-map-support@^0.5.6, source-map-support@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== @@ -7400,11 +7868,6 @@ string_decoder@^1.1.1: 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" @@ -7426,12 +7889,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^4.0.0" + ansi-regex "^4.1.0" strip-bom@^3.0.0: version "3.0.0" @@ -7443,12 +7906,17 @@ strip-eof@^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, strip-json-comments@~2.0.1: +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +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, subscriptions-transport-ws@^0.9.8: +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== @@ -7483,6 +7951,13 @@ supertest@~4.0.2: methods "^1.1.2" superagent "^3.8.3" +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" @@ -7604,6 +8079,38 @@ title-case@^2.1.1: no-case "^2.2.0" upper-case "^1.0.3" +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.203.0: + version "1.203.1" + resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" + integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== + +tldts-core@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.3.1.tgz#040450d7148107880ba9020e77b3b28a6cc5d9db" + integrity sha512-z8C2wcT2XvSgk5p0HWapXPkvvKG7E8Jei71N+9Mpp9Eoh2/wjtQPhDeENSuzHNmjTdRz6KFIcM7aWTB+7g0OyA== + +tldts@~5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.3.1.tgz#39b2164b71777e69b3d05e5db5a30b5e1a5df6b7" + integrity sha512-JHG3Gonv+17qi1gyskY0KwdpjVkQfQK4pMHm52vpdKXV3y9AzEhhinDT/GfLF8w7kRLpIHhcViZ0rEsFla81lA== + dependencies: + tldts-core "^5.3.1" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -7628,6 +8135,11 @@ to-object-path@^0.3.0: 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" @@ -7693,11 +8205,25 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trigram-utils@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/trigram-utils/-/trigram-utils-1.0.2.tgz#47574b7fade636e0fc06515788cbbd61786d2292" + integrity sha512-4/DmYtegpRAyTHPpL+asfLHfTdrTZ5N0FNaixyb4L6Bx3mi+g1wgsFJNixZ9Ycsjs3+FrK4zJoWW86cdMaL8RA== + dependencies: + collapse-white-space "^1.0.3" + n-gram "^1.0.0" + trim "0.0.1" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + trunc-html@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/trunc-html/-/trunc-html-1.1.2.tgz#1e97d51f67d470b67662b1a670e6d0ea7a8edafe" @@ -7712,6 +8238,16 @@ trunc-text@1.0.1: resolved "https://registry.yarnpkg.com/trunc-text/-/trunc-text-1.0.1.tgz#58f876d8ac59b224b79834bb478b8656e69622b5" integrity sha1-WPh22KxZsiS3mDS7R4uGVuaWIrU= +truncate@~2.0.1: + version "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== + ts-invariant@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.2.tgz#8685131b8083e67c66d602540e78763408be9113" @@ -7719,10 +8255,10 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -tslib@^1.9.0, tslib@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tslib@1.10.0, tslib@^1.9.0, tslib@^1.9.3: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tunnel-agent@^0.6.0: version "0.6.0" @@ -7879,13 +8415,36 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -url@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= +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: - punycode "1.3.2" - querystring "0.2.0" + prepend-http "^2.0.0" + +url-parse@^1.4.4: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + 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" + +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" @@ -7922,16 +8481,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== - uuid@^3.1.0, uuid@^3.3.2, 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== +v8-compile-cache@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + v8flags@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053" @@ -7939,6 +8498,11 @@ v8flags@^3.1.1: dependencies: homedir-polyfill "^1.0.1" +valid-url@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -7961,6 +8525,11 @@ verror@1.10.0, verror@^1.9.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= + vocabs-as@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/vocabs-as/-/vocabs-as-3.0.0.tgz#0dd0549cecb331ba4e917d2c5a4e83b146865c23" @@ -8037,13 +8606,13 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -wait-on@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-3.2.0.tgz#c83924df0fc42a675c678324c49c769d378bcb85" - integrity sha512-QUGNKlKLDyY6W/qHdxaRlXUAgLPe+3mLL/tRByHpRNcHs/c7dZXbu+OnJWGNux6tU1WFh/Z8aEwvbuzSAu79Zg== +wait-on@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-3.3.0.tgz#9940981d047a72a9544a97b8b5fca45b2170a082" + integrity sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ== dependencies: - core-js "^2.5.7" - joi "^13.0.0" + "@hapi/joi" "^15.0.3" + core-js "^2.6.5" minimist "^1.2.0" request "^2.88.0" rx "^4.1.0" @@ -8072,6 +8641,11 @@ whatwg-fetch@2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-fetch@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -8107,6 +8681,14 @@ which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" +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 "~2.0.0" + mimic-fn "~2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -8183,10 +8765,10 @@ ws@^6.0.0: dependencies: async-limiter "~1.0.0" -x-xss-protection@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.1.0.tgz#4f1898c332deb1e7f2be1280efb3e2c53d69c1a7" - integrity sha512-rx3GzJlgEeZ08MIcDsU2vY2B1QEriUKJTSiNHHUIem6eg9pzVOr2TL3Y4Pd6TMAM5D5azGjcxqI62piITBDHVg== +x-xss-protection@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/x-xss-protection/-/x-xss-protection-1.2.0.tgz#3170498ff8e7e8159f4896b27fa4d4810c2ff486" + integrity sha512-xN0kV+8XfOQM2OPPBdEbGtbvJNNP1pvZR7sE6d44cjJFQG4OiGDdienPg5iOUGswBTiGbBvtYDURd30BMJwwqg== xdg-basedir@^3.0.0: version "3.0.0" @@ -8198,7 +8780,7 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.4.19, xml2js@^0.4.17: +xml2js@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== diff --git a/cypress/integration/administration/TagsAndCategories.feature b/cypress/integration/administration/TagsAndCategories.feature index e55535ea9..96196be01 100644 --- a/cypress/integration/administration/TagsAndCategories.feature +++ b/cypress/integration/administration/TagsAndCategories.feature @@ -22,16 +22,16 @@ Feature: Tags and Categories When I navigate to the administration dashboard And I click on the menu item "Categories" Then I can see the following table: - | | Name | Posts | - | | Just For Fun | 2 | - | | Happyness & Values | 1 | - | | Health & Wellbeing | 0 | + | | Name | Posts | + | | Just For Fun | 2 | + | | Happyness & Values | 1 | + | | Health & Wellbeing | 0 | Scenario: See an overview of tags When I navigate to the administration dashboard And I click on the menu item "Tags" Then I can see the following table: - | | Name | Users | Posts | - | 1 | Democracy | 3 | 4 | - | 2 | Nature | 2 | 3 | - | 3 | Ecology | 1 | 1 | + | | Name | Users | Posts | + | 1 | Democracy | 3 | 4 | + | 2 | Nature | 2 | 3 | + | 3 | Ecology | 1 | 1 | diff --git a/cypress/integration/common/profile.js b/cypress/integration/common/profile.js index 1df1e2652..b1bf9e4e0 100644 --- a/cypress/integration/common/profile.js +++ b/cypress/integration/common/profile.js @@ -1,36 +1,36 @@ -import { When, Then } from 'cypress-cucumber-preprocessor/steps' +import { When, Then } from "cypress-cucumber-preprocessor/steps"; /* global cy */ -When('I visit my profile page', () => { - cy.openPage('profile/peter-pan') -}) +When("I visit my profile page", () => { + cy.openPage("profile/peter-pan"); +}); -Then('I should be able to change my profile picture', () => { - const avatarUpload = 'onourjourney.png' +Then("I should be able to change my profile picture", () => { + const avatarUpload = "onourjourney.png"; - cy.fixture(avatarUpload, 'base64').then(fileContent => { - cy.get('#customdropzone').upload( - { fileContent, fileName: avatarUpload, mimeType: 'image/png' }, - { subjectType: 'drag-n-drop' } - ) - }) - cy.get('.profile-avatar img') - .should('have.attr', 'src') - .and('contains', 'onourjourney') - cy.contains('.iziToast-message', 'Upload successful').should( - 'have.length', + cy.fixture(avatarUpload, "base64").then(fileContent => { + cy.get("#customdropzone").upload( + { fileContent, fileName: avatarUpload, mimeType: "image/png" }, + { subjectType: "drag-n-drop", force: true } + ); + }); + cy.get(".profile-avatar img") + .should("have.attr", "src") + .and("contains", "onourjourney"); + cy.contains(".iziToast-message", "Upload successful").should( + "have.length", 1 - ) -}) + ); +}); When("I visit another user's profile page", () => { - cy.openPage('profile/peter-pan') -}) + cy.openPage("profile/peter-pan"); +}); -Then('I cannot upload a picture', () => { - cy.get('.ds-card-content') +Then("I cannot upload a picture", () => { + cy.get(".ds-card-content") .children() - .should('not.have.id', 'customdropzone') - .should('have.class', 'ds-avatar') -}) + .should("not.have.id", "customdropzone") + .should("have.class", "ds-avatar"); +}); diff --git a/cypress/support/factories.js b/cypress/support/factories.js index dd16e8198..825f65b83 100644 --- a/cypress/support/factories.js +++ b/cypress/support/factories.js @@ -23,24 +23,27 @@ Cypress.Commands.add('factory', () => { Cypress.Commands.add( 'create', { prevSubject: true }, - (factory, node, properties) => { - return factory.create(node, properties) + async (factory, node, properties) => { + await factory.create(node, properties) + return factory } ) Cypress.Commands.add( 'relate', { prevSubject: true }, - (factory, node, relationship, properties) => { - return factory.relate(node, relationship, properties) + async (factory, node, relationship, properties) => { + await factory.relate(node, relationship, properties) + return factory } ) Cypress.Commands.add( 'mutate', { prevSubject: true }, - (factory, mutation, variables) => { - return factory.mutate(mutation, variables) + async (factory, mutation, variables) => { + await factory.mutate(mutation, variables) + return factory } ) diff --git a/deployment/human-connection/templates/configmap.template.yaml b/deployment/human-connection/templates/configmap.template.yaml index 2b7ffeeb8..1e8b37b06 100644 --- a/deployment/human-connection/templates/configmap.template.yaml +++ b/deployment/human-connection/templates/configmap.template.yaml @@ -4,14 +4,10 @@ data: SMTP_HOST: "mailserver.human-connection" SMTP_PORT: "25" - SMTP_USERNAME: "" - SMTP_PASSWORD: "" GRAPHQL_PORT: "4000" GRAPHQL_URI: "http://nitro-backend.human-connection:4000" MOCKS: "false" NEO4J_URI: "bolt://nitro-neo4j.human-connection:7687" - NEO4J_USERNAME: "neo4j" - NEO4J_PASSWORD: "neo4j" NEO4J_AUTH: "none" CLIENT_URI: "https://nitro-staging.human-connection.org" metadata: diff --git a/deployment/human-connection/templates/secrets.template.yaml b/deployment/human-connection/templates/secrets.template.yaml index 9f59b948a..6a6206189 100644 --- a/deployment/human-connection/templates/secrets.template.yaml +++ b/deployment/human-connection/templates/secrets.template.yaml @@ -5,11 +5,10 @@ data: MONGODB_PASSWORD: "TU9OR09EQl9QQVNTV09SRA==" PRIVATE_KEY_PASSPHRASE: "YTdkc2Y3OHNhZGc4N2FkODdzZmFnc2FkZzc4" MAPBOX_TOKEN: "cGsuZXlKMUlqb2lhSFZ0WVc0dFkyOXVibVZqZEdsdmJpSXNJbUVpT2lKamFqbDBjbkJ1Ykdvd2VUVmxNM1Z3WjJsek5UTnVkM1p0SW4wLktaOEtLOWw3MG9talhiRWtrYkhHc1EK" - SMTP_HOST: - SMTP_PORT: 587 SMTP_USERNAME: SMTP_PASSWORD: - SMTP_IGNORE_TLS: + NEO4J_USERNAME: + NEO4J_PASSWORD: metadata: name: human-connection namespace: human-connection diff --git a/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql index 027cea019..adf63dc1f 100644 --- a/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql +++ b/deployment/legacy-migration/maintenance-worker/migration/neo4j/badges/badges.cql @@ -25,7 +25,7 @@ [?] type: String, // in nitro this is a defined enum - seems good for now [X] required: true }, -[X] key: { +[X] id: { [X] type: String, [X] required: true }, @@ -43,7 +43,7 @@ CALL apoc.load.json("file:${IMPORT_CHUNK_PATH_CQL_FILE}") YIELD value as badge MERGE(b:Badge {id: badge._id["$oid"]}) ON CREATE SET -b.key = badge.key, +b.id = badge.key, b.type = badge.type, b.icon = replace(badge.image.path, 'https://api-alpha.human-connection.org', ''), b.status = badge.status, diff --git a/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql b/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql index 4d7c9aa9f..7574fd3b2 100644 --- a/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql +++ b/deployment/legacy-migration/maintenance-worker/migration/neo4j/users/users.cql @@ -101,7 +101,7 @@ ON CREATE SET u.name = user.name, u.slug = user.slug, u.email = user.email, -u.password = user.password, +u.encryptedPassword = user.password, u.avatar = replace(user.avatar, 'https://api-alpha.human-connection.org', ''), u.coverImg = replace(user.coverImg, 'https://api-alpha.human-connection.org', ''), u.wasInvited = user.wasInvited, @@ -111,6 +111,13 @@ u.createdAt = user.createdAt.`$date`, u.updatedAt = user.updatedAt.`$date`, u.deleted = user.deletedAt IS NOT NULL, u.disabled = false +MERGE (e:EmailAddress { + email: user.email, + createdAt: toString(datetime()), + verifiedAt: toString(datetime()) +}) +MERGE (e)-[:BELONGS_TO]->(u) +MERGE (u)<-[:PRIMARY_EMAIL]-(e) WITH u, user, user.badgeIds AS badgeIds UNWIND badgeIds AS badgeId MATCH (b:Badge {id: badgeId}) diff --git a/docker-compose.travis.yml b/docker-compose.travis.yml index bc627a67a..0c6576ca7 100644 --- a/docker-compose.travis.yml +++ b/docker-compose.travis.yml @@ -26,9 +26,4 @@ services: ports: - 4001:4001 - 4123:4123 - neo4j: - environment: - - NEO4J_AUTH=none - ports: - - 7687:7687 - - 7474:7474 + diff --git a/docker-compose.yml b/docker-compose.yml index 86d3d4b2a..bae571b86 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ services: networks: - hc-network environment: + - NUXT_BUILD=.nuxt-dist - HOST=0.0.0.0 - GRAPHQL_URI=http://backend:4000 - MAPBOX_TOKEN="pk.eyJ1IjoiaHVtYW4tY29ubmVjdGlvbiIsImEiOiJjajl0cnBubGoweTVlM3VwZ2lzNTNud3ZtIn0.bZ8KK9l70omjXbEkkbHGsQ" diff --git a/neo4j/db_setup.sh b/neo4j/db_setup.sh index 21ed54571..d4c7b9af8 100755 --- a/neo4j/db_setup.sh +++ b/neo4j/db_setup.sh @@ -34,6 +34,8 @@ CREATE CONSTRAINT ON (p:Post) ASSERT p.slug IS UNIQUE; CREATE CONSTRAINT ON (c:Category) ASSERT c.slug IS UNIQUE; CREATE CONSTRAINT ON (u:User) ASSERT u.slug IS UNIQUE; CREATE CONSTRAINT ON (o:Organization) ASSERT o.slug IS UNIQUE; + +CREATE CONSTRAINT ON (e:EmailAddress) ASSERT e.email IS UNIQUE; ' | cypher-shell echo ' diff --git a/package.json b/package.json index b93b154ac..c7a78bc38 100644 --- a/package.json +++ b/package.json @@ -23,14 +23,14 @@ "codecov": "^3.5.0", "cross-env": "^5.2.0", "cypress": "^3.4.0", - "cypress-cucumber-preprocessor": "^1.12.0", - "cypress-file-upload": "^3.2.0", + "cypress-cucumber-preprocessor": "^1.13.0", + "cypress-file-upload": "^3.3.2", "cypress-plugin-retries": "^1.2.2", "dotenv": "^8.0.0", "faker": "Marak/faker.js#master", "graphql-request": "^1.8.2", "neo4j-driver": "^1.7.5", - "neode": "^0.2.16", + "neode": "^0.2.18", "npm-run-all": "^4.1.5", "slug": "^1.1.0" } diff --git a/webapp/.gitignore b/webapp/.gitignore index f8c980f7c..bc179d78a 100644 --- a/webapp/.gitignore +++ b/webapp/.gitignore @@ -61,6 +61,8 @@ typings/ # nuxt.js build output .nuxt +# also the build output in docker container +.nuxt-dist # Nuxt generate dist diff --git a/webapp/components/Badges.vue b/webapp/components/Badges.vue index 42ac23e4d..936d13adb 100644 --- a/webapp/components/Badges.vue +++ b/webapp/components/Badges.vue @@ -1,6 +1,6 @@ diff --git a/webapp/components/FilterPosts/FilterPostsMenuItems.vue b/webapp/components/FilterPosts/FilterPostsMenuItems.vue new file mode 100644 index 000000000..593781cdb --- /dev/null +++ b/webapp/components/FilterPosts/FilterPostsMenuItems.vue @@ -0,0 +1,126 @@ + + + diff --git a/webapp/components/comments/CommentForm/index.vue b/webapp/components/comments/CommentForm/index.vue index 14dcace43..e0e0058e5 100644 --- a/webapp/components/comments/CommentForm/index.vue +++ b/webapp/components/comments/CommentForm/index.vue @@ -1,5 +1,5 @@