diff --git a/CHANGELOG.md b/CHANGELOG.md index 1590f24a6..ac24ea43c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,141 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v0.6.1](https://github.com/Human-Connection/Human-Connection/compare/v0.6.0...v0.6.1) + +> 4 May 2020 + +- feat: FollowerList [1741] [`#3293`](https://github.com/Human-Connection/Human-Connection/pull/3293) +- fix: Text of editor embeds disappearing on click [2727] [`#3356`](https://github.com/Human-Connection/Human-Connection/pull/3356) +- build(deps-dev): bump css-loader from 3.5.1 to 3.5.2 in /webapp [`#3475`](https://github.com/Human-Connection/Human-Connection/pull/3475) +- build(deps): bump apollo-link-context from 1.0.19 to 1.0.20 in /backend [`#3472`](https://github.com/Human-Connection/Human-Connection/pull/3472) +- build(deps): bump date-fns from 2.11.1 to 2.12.0 in /webapp [`#3467`](https://github.com/Human-Connection/Human-Connection/pull/3467) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /webapp [`#3459`](https://github.com/Human-Connection/Human-Connection/pull/3459) +- build(deps-dev): bump date-fns from 2.11.1 to 2.12.0 [`#3464`](https://github.com/Human-Connection/Human-Connection/pull/3464) +- build(deps): bump apollo-link-http from 1.5.16 to 1.5.17 in /backend [`#3465`](https://github.com/Human-Connection/Human-Connection/pull/3465) +- build(deps-dev): bump babel-jest from 25.2.6 to 25.3.0 in /webapp [`#3456`](https://github.com/Human-Connection/Human-Connection/pull/3456) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /backend [`#3454`](https://github.com/Human-Connection/Human-Connection/pull/3454) +- build(deps-dev): bump jest from 25.2.7 to 25.3.0 in /backend [`#3453`](https://github.com/Human-Connection/Human-Connection/pull/3453) +- build(deps-dev): bump expect from 25.2.7 to 25.3.0 [`#3452`](https://github.com/Human-Connection/Human-Connection/pull/3452) +- build(deps-dev): bump @vue/cli-shared-utils from 4.3.0 to 4.3.1 in /webapp [`#3446`](https://github.com/Human-Connection/Human-Connection/pull/3446) +- build(deps-dev): bump css-loader from 3.5.0 to 3.5.1 in /webapp [`#3448`](https://github.com/Human-Connection/Human-Connection/pull/3448) +- build(deps): bump apollo-server-express from 2.11.0 to 2.12.0 in /backend [`#3443`](https://github.com/Human-Connection/Human-Connection/pull/3443) +- build(deps-dev): bump @babel/preset-env from 7.9.0 to 7.9.5 in /backend [`#3441`](https://github.com/Human-Connection/Human-Connection/pull/3441) +- build(deps): bump metascraper-image from 5.11.6 to 5.11.8 in /backend [`#3439`](https://github.com/Human-Connection/Human-Connection/pull/3439) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.1.0 to 2.2.1 [`#3438`](https://github.com/Human-Connection/Human-Connection/pull/3438) +- build(deps): bump metascraper-youtube from 5.11.6 to 5.11.8 in /backend [`#3435`](https://github.com/Human-Connection/Human-Connection/pull/3435) +- build(deps): bump metascraper-soundcloud from 5.11.7 to 5.11.8 in /backend [`#3432`](https://github.com/Human-Connection/Human-Connection/pull/3432) +- refactor: favor CSS over syleguide components SearchPost.vue [`#3377`](https://github.com/Human-Connection/Human-Connection/pull/3377) +- chore: removed unused fuse.js [`#3411`](https://github.com/Human-Connection/Human-Connection/pull/3411) +- build(deps-dev): bump jest from 25.2.6 to 25.2.7 in /backend [`#3434`](https://github.com/Human-Connection/Human-Connection/pull/3434) +- build(deps): bump merge-graphql-schemas from 1.7.6 to 1.7.7 in /backend [`#3397`](https://github.com/Human-Connection/Human-Connection/pull/3397) +- chore: Update docs for spaces backups [`#3428`](https://github.com/Human-Connection/Human-Connection/pull/3428) +- build(deps): bump metascraper-date from 5.11.6 to 5.11.8 in /backend [`#3431`](https://github.com/Human-Connection/Human-Connection/pull/3431) +- build(deps): bump metascraper-publisher from 5.11.6 to 5.11.8 in /backend [`#3430`](https://github.com/Human-Connection/Human-Connection/pull/3430) +- build(deps-dev): bump css-loader from 3.4.2 to 3.5.0 in /webapp [`#3436`](https://github.com/Human-Connection/Human-Connection/pull/3436) +- build(deps): bump metascraper-lang from 5.11.6 to 5.11.8 in /backend [`#3433`](https://github.com/Human-Connection/Human-Connection/pull/3433) +- build(deps-dev): bump prettier from 2.0.2 to 2.0.4 in /webapp [`#3429`](https://github.com/Human-Connection/Human-Connection/pull/3429) +- build(deps): bump metascraper-url from 5.11.6 to 5.11.8 in /backend [`#3420`](https://github.com/Human-Connection/Human-Connection/pull/3420) +- build(deps): bump metascraper from 5.11.6 to 5.11.8 in /backend [`#3419`](https://github.com/Human-Connection/Human-Connection/pull/3419) +- build(deps-dev): bump storybook-design-token from 0.7.0 to 0.7.2 in /webapp [`#3422`](https://github.com/Human-Connection/Human-Connection/pull/3422) +- build(deps-dev): bump eslint-loader from 3.0.3 to 4.0.0 in /webapp [`#3424`](https://github.com/Human-Connection/Human-Connection/pull/3424) +- build(deps-dev): bump @vue/cli-shared-utils from 4.2.3 to 4.3.0 in /webapp [`#3423`](https://github.com/Human-Connection/Human-Connection/pull/3423) +- build(deps): bump metascraper-author from 5.11.6 to 5.11.8 in /backend [`#3417`](https://github.com/Human-Connection/Human-Connection/pull/3417) +- build(deps): bump metascraper-title from 5.11.6 to 5.11.8 in /backend [`#3415`](https://github.com/Human-Connection/Human-Connection/pull/3415) +- build(deps): bump metascraper-audio from 5.11.6 to 5.11.8 in /backend [`#3418`](https://github.com/Human-Connection/Human-Connection/pull/3418) +- build(deps): bump metascraper-video from 5.11.6 to 5.11.8 in /backend [`#3416`](https://github.com/Human-Connection/Human-Connection/pull/3416) +- build(deps-dev): bump jest from 25.2.4 to 25.2.7 in /webapp [`#3410`](https://github.com/Human-Connection/Human-Connection/pull/3410) +- build(deps-dev): bump expect from 25.2.4 to 25.2.7 [`#3409`](https://github.com/Human-Connection/Human-Connection/pull/3409) +- build(deps-dev): bump storybook-design-token from 0.5.1 to 0.7.0 in /webapp [`#3407`](https://github.com/Human-Connection/Human-Connection/pull/3407) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.6 in /webapp [`#3403`](https://github.com/Human-Connection/Human-Connection/pull/3403) +- build(deps-dev): bump jest from 25.2.4 to 25.2.6 in /backend [`#3401`](https://github.com/Human-Connection/Human-Connection/pull/3401) +- build(deps): bump tiptap-extensions from 1.28.7 to 1.28.8 in /webapp [`#3404`](https://github.com/Human-Connection/Human-Connection/pull/3404) +- build(deps): bump aws-sdk from 2.651.0 to 2.652.0 in /backend [`#3402`](https://github.com/Human-Connection/Human-Connection/pull/3402) +- build(deps-dev): bump auto-changelog from 1.16.3 to 1.16.4 [`#3400`](https://github.com/Human-Connection/Human-Connection/pull/3400) +- build(deps-dev): bump babel-jest from 25.2.4 to 25.2.6 in /backend [`#3399`](https://github.com/Human-Connection/Human-Connection/pull/3399) +- build(deps): bump tiptap-extensions from 1.28.6 to 1.28.7 in /webapp [`#3393`](https://github.com/Human-Connection/Human-Connection/pull/3393) +- build(deps): bump aws-sdk from 2.650.0 to 2.651.0 in /backend [`#3391`](https://github.com/Human-Connection/Human-Connection/pull/3391) +- build(deps-dev): bump @storybook/vue from 5.3.17 to 5.3.18 in /webapp [`#3387`](https://github.com/Human-Connection/Human-Connection/pull/3387) +- build(deps-dev): bump @storybook/addon-actions from 5.3.17 to 5.3.18 in /webapp [`#3386`](https://github.com/Human-Connection/Human-Connection/pull/3386) +- refactor(tests): return errors [`#3390`](https://github.com/Human-Connection/Human-Connection/pull/3390) +- build(deps): bump ioredis from 4.16.0 to 4.16.1 in /backend [`#3365`](https://github.com/Human-Connection/Human-Connection/pull/3365) +- build(deps-dev): bump @storybook/addon-a11y from 5.3.17 to 5.3.18 in /webapp [`#3384`](https://github.com/Human-Connection/Human-Connection/pull/3384) +- build(deps-dev): bump @storybook/addon-notes from 5.3.17 to 5.3.18 in /webapp [`#3385`](https://github.com/Human-Connection/Human-Connection/pull/3385) +- build(deps): bump uuid from 7.0.2 to 7.0.3 in /backend [`#3383`](https://github.com/Human-Connection/Human-Connection/pull/3383) +- build(deps): bump graphql-shield from 7.2.1 to 7.2.2 in /backend [`#3382`](https://github.com/Human-Connection/Human-Connection/pull/3382) +- build(deps): bump aws-sdk from 2.649.0 to 2.650.0 in /backend [`#3381`](https://github.com/Human-Connection/Human-Connection/pull/3381) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /webapp [`#3370`](https://github.com/Human-Connection/Human-Connection/pull/3370) +- build(deps): bump @nuxtjs/axios from 5.9.6 to 5.9.7 in /webapp [`#3380`](https://github.com/Human-Connection/Human-Connection/pull/3380) +- build(deps): bump aws-sdk from 2.648.0 to 2.649.0 in /backend [`#3379`](https://github.com/Human-Connection/Human-Connection/pull/3379) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /backend [`#3366`](https://github.com/Human-Connection/Human-Connection/pull/3366) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /backend [`#3362`](https://github.com/Human-Connection/Human-Connection/pull/3362) +- build(deps-dev): bump eslint-plugin-import from 2.20.1 to 2.20.2 in /backend [`#3367`](https://github.com/Human-Connection/Human-Connection/pull/3367) +- build(deps-dev): bump jest from 25.2.3 to 25.2.4 in /webapp [`#3373`](https://github.com/Human-Connection/Human-Connection/pull/3373) +- fix(migration): Set maxSockets to avoid rate limit [`#3375`](https://github.com/Human-Connection/Human-Connection/pull/3375) +- build(deps-dev): bump eslint-plugin-node from 11.0.0 to 11.1.0 in /webapp [`#3374`](https://github.com/Human-Connection/Human-Connection/pull/3374) +- build(deps): bump @nuxtjs/axios from 5.9.5 to 5.9.6 in /webapp [`#3371`](https://github.com/Human-Connection/Human-Connection/pull/3371) +- build(deps): bump aws-sdk from 2.647.0 to 2.648.0 in /backend [`#3368`](https://github.com/Human-Connection/Human-Connection/pull/3368) +- build(deps): bump @sentry/node from 5.15.2 to 5.15.4 in /backend [`#3364`](https://github.com/Human-Connection/Human-Connection/pull/3364) +- build(deps-dev): bump babel-jest from 25.2.3 to 25.2.4 in /backend [`#3363`](https://github.com/Human-Connection/Human-Connection/pull/3363) +- build(deps-dev): bump expect from 25.2.3 to 25.2.4 [`#3360`](https://github.com/Human-Connection/Human-Connection/pull/3360) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`#3334`](https://github.com/Human-Connection/Human-Connection/pull/3334) +- Fix: filter not preferring full matches in back + [`b05cc30`](https://github.com/Human-Connection/Human-Connection/commit/b05cc303b4925c26a3e7a86606764888abf5790b) +- Refactor: move following/followedBy updating to page component [`e6361c9`](https://github.com/Human-Connection/Human-Connection/commit/e6361c9b740f104c0a0d86b463be835f10311f3d) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`93f43e2`](https://github.com/Human-Connection/Human-Connection/commit/93f43e26653ee9faeed1a8c096f9b8a5a04422a9) + +#### [v0.6.0](https://github.com/Human-Connection/Human-Connection/compare/v0.5.0...v0.6.0) + +> 27 March 2020 + +- chore: upgrade to v0.6.0 [`#3359`](https://github.com/Human-Connection/Human-Connection/pull/3359) +- build(deps): bump helmet from 3.21.3 to 3.22.0 in /backend [`#3337`](https://github.com/Human-Connection/Human-Connection/pull/3337) +- build(deps-dev): bump jest from 25.2.1 to 25.2.3 in /webapp [`#3354`](https://github.com/Human-Connection/Human-Connection/pull/3354) +- build(deps-dev): bump cypress-cucumber-preprocessor from 2.0.1 to 2.1.0 [`#3349`](https://github.com/Human-Connection/Human-Connection/pull/3349) +- build(deps): bump aws-sdk from 2.638.0 to 2.647.0 in /backend [`#3352`](https://github.com/Human-Connection/Human-Connection/pull/3352) +- refactor: FilterMenu as a first step to remove ds-flex [`#3257`](https://github.com/Human-Connection/Human-Connection/pull/3257) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /webapp [`#3355`](https://github.com/Human-Connection/Human-Connection/pull/3355) +- Remove dangling image urls [`#3343`](https://github.com/Human-Connection/Human-Connection/pull/3343) +- build(deps-dev): bump expect from 25.2.0 to 25.2.3 [`#3347`](https://github.com/Human-Connection/Human-Connection/pull/3347) +- build(deps-dev): bump babel-jest from 25.2.1 to 25.2.3 in /backend [`#3350`](https://github.com/Human-Connection/Human-Connection/pull/3350) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.3 in /webapp [`#3353`](https://github.com/Human-Connection/Human-Connection/pull/3353) +- build(deps): bump date-fns from 2.11.0 to 2.11.1 in /backend [`#3351`](https://github.com/Human-Connection/Human-Connection/pull/3351) +- build(deps): bump @sentry/node from 5.15.0 to 5.15.2 in /backend [`#3348`](https://github.com/Human-Connection/Human-Connection/pull/3348) +- build(deps-dev): bump jest from 25.2.0 to 25.2.3 in /backend [`#3346`](https://github.com/Human-Connection/Human-Connection/pull/3346) +- build(deps-dev): bump date-fns from 2.11.0 to 2.11.1 [`#3345`](https://github.com/Human-Connection/Human-Connection/pull/3345) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 [`#3309`](https://github.com/Human-Connection/Human-Connection/pull/3309) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /backend [`#3314`](https://github.com/Human-Connection/Human-Connection/pull/3314) +- build(deps-dev): bump babel-jest from 25.2.0 to 25.2.1 in /backend [`#3341`](https://github.com/Human-Connection/Human-Connection/pull/3341) +- build(deps-dev): bump jest from 25.1.0 to 25.2.1 in /webapp [`#3342`](https://github.com/Human-Connection/Human-Connection/pull/3342) +- feat(backend): upload original image files on S3 object storage [`#3262`](https://github.com/Human-Connection/Human-Connection/pull/3262) +- chore: fix lint w/ new linting rules [`06985c2`](https://github.com/Human-Connection/Human-Connection/commit/06985c2dbbc6699cc5c3dfd6e55cac8d28e9019b) +- chore: upgreade to v0.6.0 [`29f49a8`](https://github.com/Human-Connection/Human-Connection/commit/29f49a85c0b49fa0b3a34cb016a4a1d4734d5ae6) +- build(deps-dev): bump auto-changelog from 1.16.2 to 1.16.3 [`5d8ab84`](https://github.com/Human-Connection/Human-Connection/commit/5d8ab84df03d1324832cad1d4a2a6b4953706d86) + #### [v0.5.0](https://github.com/Human-Connection/Human-Connection/compare/v0.4.2...v0.5.0) -> 20 March 2020 +> 26 March 2020 +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /backend [`#3336`](https://github.com/Human-Connection/Human-Connection/pull/3336) +- build(deps): bump nuxt from 2.12.0 to 2.12.1 in /webapp [`#3338`](https://github.com/Human-Connection/Human-Connection/pull/3338) +- build(deps-dev): bump babel-jest from 25.1.0 to 25.2.0 in /webapp [`#3340`](https://github.com/Human-Connection/Human-Connection/pull/3340) +- build(deps-dev): bump jest from 25.1.0 to 25.2.0 in /backend [`#3335`](https://github.com/Human-Connection/Human-Connection/pull/3335) +- build(deps-dev): bump expect from 25.1.0 to 25.2.0 [`#3333`](https://github.com/Human-Connection/Human-Connection/pull/3333) +- build(deps): bump @nuxtjs/sentry from 3.3.1 to 4.0.0 in /webapp [`#3332`](https://github.com/Human-Connection/Human-Connection/pull/3332) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /webapp [`#3316`](https://github.com/Human-Connection/Human-Connection/pull/3316) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 in /backend [`#3313`](https://github.com/Human-Connection/Human-Connection/pull/3313) +- build(deps-dev): bump @babel/preset-env from 7.8.7 to 7.9.0 in /webapp [`#3319`](https://github.com/Human-Connection/Human-Connection/pull/3319) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 in /backend [`#3305`](https://github.com/Human-Connection/Human-Connection/pull/3305) +- build(deps): bump @sentry/node from 5.14.2 to 5.15.0 in /backend [`#3331`](https://github.com/Human-Connection/Human-Connection/pull/3331) +- build(deps-dev): bump prettier from 1.19.1 to 2.0.2 in /webapp [`#3327`](https://github.com/Human-Connection/Human-Connection/pull/3327) +- build(deps-dev): bump babel-loader from 8.0.6 to 8.1.0 in /webapp [`#3315`](https://github.com/Human-Connection/Human-Connection/pull/3315) +- build(deps-dev): bump @babel/register from 7.8.6 to 7.9.0 [`#3310`](https://github.com/Human-Connection/Human-Connection/pull/3310) +- build(deps-dev): bump @babel/core from 7.8.7 to 7.9.0 [`#3304`](https://github.com/Human-Connection/Human-Connection/pull/3304) +- fix(migration): return null for Image.url [`#3323`](https://github.com/Human-Connection/Human-Connection/pull/3323) +- build(deps): bump graphql-shield from 7.2.0 to 7.2.1 in /backend [`#3296`](https://github.com/Human-Connection/Human-Connection/pull/3296) +- fix(build): make locations spec more resilient [`#3324`](https://github.com/Human-Connection/Human-Connection/pull/3324) +- fix(migration): Avoid unique constraint violation [`#3303`](https://github.com/Human-Connection/Human-Connection/pull/3303) +- chore: upgrade to v0.5.0 [`#3302`](https://github.com/Human-Connection/Human-Connection/pull/3302) +- build(deps): bump validator from 12.2.0 to 13.0.0 in /webapp [`#3301`](https://github.com/Human-Connection/Human-Connection/pull/3301) - feat: Search for Hashtags [`#3297`](https://github.com/Human-Connection/Human-Connection/pull/3297) - build(deps): bump metascraper-soundcloud from 5.11.6 to 5.11.7 in /backend [`#3300`](https://github.com/Human-Connection/Human-Connection/pull/3300) - build(deps): bump validator from 12.2.0 to 13.0.0 in /backend [`#3299`](https://github.com/Human-Connection/Human-Connection/pull/3299) @@ -36,6 +167,14 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps-dev): bump date-fns from 2.10.0 to 2.11.0 [`#3273`](https://github.com/Human-Connection/Human-Connection/pull/3273) - build(deps): [security] bump acorn from 6.3.0 to 6.4.1 in /backend [`#3270`](https://github.com/Human-Connection/Human-Connection/pull/3270) - build(deps): [security] bump acorn from 6.1.1 to 6.4.1 [`#3269`](https://github.com/Human-Connection/Human-Connection/pull/3269) +- Update prettier to v2 [`276ea79`](https://github.com/Human-Connection/Human-Connection/commit/276ea79e8ff2de2d02698b486671aee7cfda860e) +- refactor: CategoriesFilter to not use ds-flex [`1ffde6b`](https://github.com/Human-Connection/Human-Connection/commit/1ffde6bf1034d1a1d9b7bca62fe66fe64527314c) +- Changes requested by @mattwr18 [`9c08db2`](https://github.com/Human-Connection/Human-Connection/commit/9c08db22dcd0ca1ad6e59be8fb0f287935b45537) + +#### [v0.4.2](https://github.com/Human-Connection/Human-Connection/compare/v0.4.1...v0.4.2) + +> 13 March 2020 + - build(deps): bump graphql-shield from 7.1.0 to 7.2.0 in /backend [`#3265`](https://github.com/Human-Connection/Human-Connection/pull/3265) - build(deps): bump sanitize-html from 1.22.0 to 1.22.1 in /backend [`#3264`](https://github.com/Human-Connection/Human-Connection/pull/3264) - build(deps): bump @sentry/node from 5.14.0 to 5.14.1 in /backend [`#3263`](https://github.com/Human-Connection/Human-Connection/pull/3263) @@ -45,14 +184,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps): bump @nuxtjs/sentry from 3.2.4 to 3.3.1 in /webapp [`#3237`](https://github.com/Human-Connection/Human-Connection/pull/3237) - build(deps-dev): bump eslint-plugin-jest from 23.8.1 to 23.8.2 in /webapp [`#3228`](https://github.com/Human-Connection/Human-Connection/pull/3228) - chore: Update to version 0.4.2 [`#3261`](https://github.com/Human-Connection/Human-Connection/pull/3261) -- Changes requested by @mattwr18 [`9c08db2`](https://github.com/Human-Connection/Human-Connection/commit/9c08db22dcd0ca1ad6e59be8fb0f287935b45537) -- search specs refactored [`46fca22`](https://github.com/Human-Connection/Human-Connection/commit/46fca229ec35047eda9ac7809e7bc456785a6c70) -- Search for Hashtags works due watching route in pages/index.vue [`1c43d5f`](https://github.com/Human-Connection/Human-Connection/commit/1c43d5fe6f44c7b11168af8bd765b8d785a6641a) - -#### [v0.4.2](https://github.com/Human-Connection/Human-Connection/compare/v0.4.1...v0.4.2) - -> 12 March 2020 - - build(deps): bump @sentry/node from 5.13.1 to 5.14.0 in /backend [`#3260`](https://github.com/Human-Connection/Human-Connection/pull/3260) - build(deps): bump graphql-shield from 7.0.14 to 7.1.0 in /backend [`#3259`](https://github.com/Human-Connection/Human-Connection/pull/3259) - feat: more prominent output of ./scripts/translations/sort.sh and hint to --fix feature of the script on errors [`#3251`](https://github.com/Human-Connection/Human-Connection/pull/3251) @@ -71,7 +202,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps): bump metascraper-description from 5.11.1 to 5.11.6 in /backend [`#3233`](https://github.com/Human-Connection/Human-Connection/pull/3233) - build(deps): bump cross-env from 7.0.1 to 7.0.2 in /backend [`#3245`](https://github.com/Human-Connection/Human-Connection/pull/3245) - build(deps): bump metascraper-title from 5.11.1 to 5.11.6 in /backend [`#3244`](https://github.com/Human-Connection/Human-Connection/pull/3244) -- chore: Update to v0.4.1 [`#3243`](https://github.com/Human-Connection/Human-Connection/pull/3243) - DRY user.spec.js [`da16590`](https://github.com/Human-Connection/Human-Connection/commit/da165906e2ed12baddd902b43064103ab3adfa06) - test deleteuser as admin, moderator, another user and as I myself, fix lint [`3983612`](https://github.com/Human-Connection/Human-Connection/commit/3983612c56ac92473a192a318959e4c691a3e7b8) - feature: test delete user as admin [`84c1547`](https://github.com/Human-Connection/Human-Connection/commit/84c154798efac0cec4c13dfefae18a6a9542058a) @@ -80,6 +210,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). > 9 March 2020 +- chore: Update to v0.4.1 [`#3243`](https://github.com/Human-Connection/Human-Connection/pull/3243) - build(deps): bump metascraper-publisher from 5.11.1 to 5.11.6 in /backend [`#3226`](https://github.com/Human-Connection/Human-Connection/pull/3226) - build(deps-dev): bump eslint-plugin-vue from 6.2.1 to 6.2.2 in /webapp [`#3238`](https://github.com/Human-Connection/Human-Connection/pull/3238) - build(deps): bump metascraper-date from 5.11.1 to 5.11.6 in /backend [`#3236`](https://github.com/Human-Connection/Human-Connection/pull/3236) @@ -148,6 +279,14 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps): bump sanitize-html from 1.21.1 to 1.22.0 in /backend [`#3145`](https://github.com/Human-Connection/Human-Connection/pull/3145) - build(deps): bump nodemailer from 6.4.2 to 6.4.3 in /backend [`#3144`](https://github.com/Human-Connection/Human-Connection/pull/3144) - build(deps): bump metascraper-video from 5.10.7 to 5.11.1 in /backend [`#3143`](https://github.com/Human-Connection/Human-Connection/pull/3143) +- build(deps-dev): bump @storybook/addon-notes in /webapp [`5ef2b25`](https://github.com/Human-Connection/Human-Connection/commit/5ef2b25ee6a3402a2ebe2f3f55dd65a6e0a1111e) +- build(deps-dev): bump @storybook/addon-a11y in /webapp [`f209436`](https://github.com/Human-Connection/Human-Connection/commit/f209436147fbf9afacfbd6edb6135847e6c4faed) +- build(deps): bump apollo-server-express in /backend [`3b35487`](https://github.com/Human-Connection/Human-Connection/commit/3b35487f0671490dee1e636fb938c408722bfd45) + +#### [v0.4.0](https://github.com/Human-Connection/Human-Connection/compare/v0.3.1...v0.4.0) + +> 22 February 2020 + - feat: the point -no political use - added [`#3138`](https://github.com/Human-Connection/Human-Connection/pull/3138) - build(deps): bump metascraper-lang from 5.10.7 to 5.11.1 in /backend [`#3071`](https://github.com/Human-Connection/Human-Connection/pull/3071) - build(deps): bump metascraper from 5.11.0 to 5.11.4 in /backend [`#3136`](https://github.com/Human-Connection/Human-Connection/pull/3136) @@ -157,14 +296,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - chore(cypress): Favor firefox in cypress [`#3121`](https://github.com/Human-Connection/Human-Connection/pull/3121) - build(deps): bump graphql-shield from 7.0.11 to 7.0.13 in /backend [`#3127`](https://github.com/Human-Connection/Human-Connection/pull/3127) - build(deps): bump ioredis from 4.14.1 to 4.16.0 in /backend [`#3128`](https://github.com/Human-Connection/Human-Connection/pull/3128) -- build(deps-dev): bump @storybook/addon-notes in /webapp [`5ef2b25`](https://github.com/Human-Connection/Human-Connection/commit/5ef2b25ee6a3402a2ebe2f3f55dd65a6e0a1111e) -- build(deps-dev): bump @storybook/addon-a11y in /webapp [`f209436`](https://github.com/Human-Connection/Human-Connection/commit/f209436147fbf9afacfbd6edb6135847e6c4faed) -- build(deps): bump apollo-server-express in /backend [`3b35487`](https://github.com/Human-Connection/Human-Connection/commit/3b35487f0671490dee1e636fb938c408722bfd45) - -#### [v0.4.0](https://github.com/Human-Connection/Human-Connection/compare/v0.3.1...v0.4.0) - -> 21 February 2020 - - build(deps): bump apollo-server from 2.10.0 to 2.10.1 in /backend [`#3125`](https://github.com/Human-Connection/Human-Connection/pull/3125) - fix: Favor Cypress.Promise over async/await in e2e tests [`#3115`](https://github.com/Human-Connection/Human-Connection/pull/3115) - docs(setup): Fix links in tests [`#3120`](https://github.com/Human-Connection/Human-Connection/pull/3120) @@ -270,15 +401,15 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix: Remove github release script breaking build [`#2971`](https://github.com/Human-Connection/Human-Connection/pull/2971) - Use original createdAt for merged users/emails [`#2969`](https://github.com/Human-Connection/Human-Connection/pull/2969) - Fix typo [`#2966`](https://github.com/Human-Connection/Human-Connection/pull/2966) -- chore: Update to v0.3.0 [`#2941`](https://github.com/Human-Connection/Human-Connection/pull/2941) - Replace buildList with array of Promises [`46edc3f`](https://github.com/Human-Connection/Human-Connection/commit/46edc3fdd5b83c2f00506f595b1254d7597767e0) - refactor TeaserImage component [`e14cbf8`](https://github.com/Human-Connection/Human-Connection/commit/e14cbf8173e3040b5285ba6a5c73e2d2d2a47860) - refactor DeleteData template and CSS [`509892b`](https://github.com/Human-Connection/Human-Connection/commit/509892b6caee6c4ca8384fb0090122ced98edfd4) -#### [v0.3.0](https://github.com/Human-Connection/Human-Connection/compare/v0.2.1...v0.3.0) +#### [v0.3.0](https://github.com/Human-Connection/Human-Connection/compare/0.2.2...v0.3.0) -> 31 January 2020 +> 3 February 2020 +- chore: Update to v0.3.0 [`#2941`](https://github.com/Human-Connection/Human-Connection/pull/2941) - build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /webapp [`#2939`](https://github.com/Human-Connection/Human-Connection/pull/2939) - feat: 🍰 Direct Reply On Comment [`#2608`](https://github.com/Human-Connection/Human-Connection/pull/2608) - build(deps-dev): bump @babel/core from 7.8.3 to 7.8.4 in /backend [`#2938`](https://github.com/Human-Connection/Human-Connection/pull/2938) @@ -343,6 +474,15 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps-dev): bump jest from 24.9.0 to 25.1.0 in /backend [`#2862`](https://github.com/Human-Connection/Human-Connection/pull/2862) - docs(deployment): Explain how to setup metrics [`#2825`](https://github.com/Human-Connection/Human-Connection/pull/2825) - refactor(styleguide): Migrate Avatar component to monorepo [`#2700`](https://github.com/Human-Connection/Human-Connection/pull/2700) +- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Human-Connection/Human-Connection/issues/2411) [`#2777`](https://github.com/Human-Connection/Human-Connection/issues/2777) +- Get rid of different factory files [`fc36729`](https://github.com/Human-Connection/Human-Connection/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf) +- Refactor factory for comments [`2fc71d7`](https://github.com/Human-Connection/Human-Connection/commit/2fc71d75a5d5eab9c3467e94e00257ef6dd7d8a0) +- Refactor user factory [`2a79c53`](https://github.com/Human-Connection/Human-Connection/commit/2a79c53765b73f9b91691eb75f55cf8c9e48306e) + +#### [0.2.2](https://github.com/Human-Connection/Human-Connection/compare/v0.2.2...0.2.2) + +> 21 January 2020 + - feat: Convert block/unblock to mute/unmute [`#2686`](https://github.com/Human-Connection/Human-Connection/pull/2686) - removed obsolete German keys [`#2845`](https://github.com/Human-Connection/Human-Connection/pull/2845) - build(deps-dev): bump @vue/server-test-utils in /webapp [`#2852`](https://github.com/Human-Connection/Human-Connection/pull/2852) @@ -360,6 +500,14 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps): bump @hapi/joi from 17.0.2 to 17.1.0 in /backend [`#2846`](https://github.com/Human-Connection/Human-Connection/pull/2846) - Release 0.2.2 [`#2844`](https://github.com/Human-Connection/Human-Connection/pull/2844) - build(deps-dev): bump @storybook/addon-actions in /webapp [`#2842`](https://github.com/Human-Connection/Human-Connection/pull/2842) +- Generate changelog with auto-changelog [`02367f9`](https://github.com/Human-Connection/Human-Connection/commit/02367f93e0ad635d5f43adf01695f85f06f4c0d2) +- clean up UserAvatar a little [`d20421c`](https://github.com/Human-Connection/Human-Connection/commit/d20421cb70c4bda51fdaf59f28c3a060b59bb0cd) +- display username below slug when there is no date-time [`e93332b`](https://github.com/Human-Connection/Human-Connection/commit/e93332b17361d2c59a841e7c03e93647ec76918f) + +#### [v0.2.2](https://github.com/Human-Connection/Human-Connection/compare/v0.2.1...v0.2.2) + +> 20 January 2020 + - build(deps): bump metascraper-title from 5.10.3 to 5.10.5 in /backend [`#2835`](https://github.com/Human-Connection/Human-Connection/pull/2835) - build(deps): bump metascraper-publisher in /backend [`#2836`](https://github.com/Human-Connection/Human-Connection/pull/2836) - build(deps): bump metascraper-audio from 5.10.3 to 5.10.5 in /backend [`#2840`](https://github.com/Human-Connection/Human-Connection/pull/2840) @@ -449,13 +597,12 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Update yarn.lock after dependabot update [`#2724`](https://github.com/Human-Connection/Human-Connection/pull/2724) - build(deps): bump @nuxtjs/axios from 5.8.0 to 5.9.2 in /webapp [`#2657`](https://github.com/Human-Connection/Human-Connection/pull/2657) - Update to version 0.2.1 [`#2722`](https://github.com/Human-Connection/Human-Connection/pull/2722) -- docs(deployment): Explain how to setup metrics (#2825) [`#2411`](https://github.com/Human-Connection/Human-Connection/issues/2411) [`#2777`](https://github.com/Human-Connection/Human-Connection/issues/2777) - refactor(modules): Various import fixes [`#2773`](https://github.com/Human-Connection/Human-Connection/issues/2773) [`#2774`](https://github.com/Human-Connection/Human-Connection/issues/2774) - feat(webapp): Display deployed version in footer [`#1831`](https://github.com/Human-Connection/Human-Connection/issues/1831) - fix #2229 [`#2229`](https://github.com/Human-Connection/Human-Connection/issues/2229) -- Get rid of different factory files [`fc36729`](https://github.com/Human-Connection/Human-Connection/commit/fc367297e3e054f09b7f8f31788ab68d87f6babf) -- Refactor factory for comments [`2fc71d7`](https://github.com/Human-Connection/Human-Connection/commit/2fc71d75a5d5eab9c3467e94e00257ef6dd7d8a0) -- Refactor user factory [`2a79c53`](https://github.com/Human-Connection/Human-Connection/commit/2a79c53765b73f9b91691eb75f55cf8c9e48306e) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`d0124bf`](https://github.com/Human-Connection/Human-Connection/commit/d0124bf2b4b4a641c9af76d6d2f7b5aa075ade90) +- refactor: Make `db:setup` init stage of `migrate` [`b063847`](https://github.com/Human-Connection/Human-Connection/commit/b063847849a84db885337dc8e84e75ddaf87011f) +- refactor and use base-button in SearchableInput [`fcbe612`](https://github.com/Human-Connection/Human-Connection/commit/fcbe6125f35c0dd23e2ba1ae63f539f5ef5990ea) #### [v0.2.1](https://github.com/Human-Connection/Human-Connection/compare/v0.2.0...v0.2.1) @@ -560,16 +707,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps): bump metascraper-publisher from 5.8.7 to 5.8.12 in /backend [`#2592`](https://github.com/Human-Connection/Human-Connection/pull/2592) - build(deps-dev): bump @babel/preset-env from 7.7.6 to 7.7.7 in /backend [`#2568`](https://github.com/Human-Connection/Human-Connection/pull/2568) - Fix imageAspectRatio set to null UpdatePost [`#2588`](https://github.com/Human-Connection/Human-Connection/pull/2588) -- Update to version 0.2.0 [`#2584`](https://github.com/Human-Connection/Human-Connection/pull/2584) - fixes #2659 [`#2659`](https://github.com/Human-Connection/Human-Connection/issues/2659) - Convert block/unblock to blacklist/whitelist [`c297b83`](https://github.com/Human-Connection/Human-Connection/commit/c297b83f873edc61ddec370633b9b65896c56591) - Rename blacklist/whitelist to mute/unmute [`ba3e9e1`](https://github.com/Human-Connection/Human-Connection/commit/ba3e9e1025bf432151c9bf1002045179b338ff7f) -- manage button states and color schemes with mixin [`1b9249c`](https://github.com/Human-Connection/Human-Connection/commit/1b9249c685e34eb2e94b31ee0ec22421c6aa6a73) +- build(deps-dev): bump storybook-design-token in /webapp [`88d39c4`](https://github.com/Human-Connection/Human-Connection/commit/88d39c4a427cb86527b06201f3f5e96d53ac09a0) #### [v0.2.0](https://github.com/Human-Connection/Human-Connection/compare/v0.1.13...v0.2.0) > 19 December 2019 +- Update to version 0.2.0 [`#2584`](https://github.com/Human-Connection/Human-Connection/pull/2584) - build(deps): bump metascraper-image from 5.8.10 to 5.8.12 in /backend [`#2556`](https://github.com/Human-Connection/Human-Connection/pull/2556) - build(deps-dev): bump @babel/core from 7.7.5 to 7.7.7 [`#2569`](https://github.com/Human-Connection/Human-Connection/pull/2569) - build(deps-dev): bump @babel/cli from 7.7.5 to 7.7.7 in /backend [`#2576`](https://github.com/Human-Connection/Human-Connection/pull/2576) @@ -656,7 +803,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Fix search by adding result id [`ebc5cf3`](https://github.com/Human-Connection/Human-Connection/commit/ebc5cf392d92acf3a9e22c8967d02ea2cf6fd7fb) - Write test/refactor tests/resolvers/middleware [`d375ebe`](https://github.com/Human-Connection/Human-Connection/commit/d375ebe7d90e3251b17f59ffba8fb1470923ebe8) -#### [v0.1.12](https://github.com/Human-Connection/Human-Connection/compare/v0.1.10...v0.1.12) +#### [v0.1.12](https://github.com/Human-Connection/Human-Connection/compare/v0.1.11...v0.1.12) > 10 December 2019 @@ -766,6 +913,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - 2329 normalize emails in login form [`#2330`](https://github.com/Human-Connection/Human-Connection/pull/2330) - Lokalise: Translations update [`#2327`](https://github.com/Human-Connection/Human-Connection/pull/2327) - Changed translation must change test :( [`#2310`](https://github.com/Human-Connection/Human-Connection/pull/2310) +- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Human-Connection/Human-Connection/issues/2237) +- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Human-Connection/Human-Connection/issues/2329) +- Move components to components/features [`2357028`](https://github.com/Human-Connection/Human-Connection/commit/235702867d97b44dac37f8059f9194e23ba7f47d) +- Refactor tests/resolvers [`d18d922`](https://github.com/Human-Connection/Human-Connection/commit/d18d9228b0057fae22b4b846f9d41f5223cd6e69) +- [WIP] Extract code into own components [`9401d4e`](https://github.com/Human-Connection/Human-Connection/commit/9401d4e1e1894d1be490b07a72e1ae7ef9bf22d9) + +#### [v0.1.11](https://github.com/Human-Connection/Human-Connection/compare/v0.1.10...v0.1.11) + +> 22 November 2019 + - build(deps-dev): bump apollo-server-testing from 2.9.9 to 2.9.12 in /backend [`#2318`](https://github.com/Human-Connection/Human-Connection/pull/2318) - build(deps-dev): bump fuse.js from 3.4.5 to 3.4.6 in /webapp [`#2314`](https://github.com/Human-Connection/Human-Connection/pull/2314) - build(deps-dev): bump eslint-config-prettier from 6.6.0 to 6.7.0 in /webapp [`#2302`](https://github.com/Human-Connection/Human-Connection/pull/2302) @@ -815,13 +972,11 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps-dev): bump eslint from 5.16.0 to 6.6.0 in /webapp [`#2205`](https://github.com/Human-Connection/Human-Connection/pull/2205) - Add locale to undefined to null [`#2233`](https://github.com/Human-Connection/Human-Connection/pull/2233) - Update to version 0.1.10 [`#2231`](https://github.com/Human-Connection/Human-Connection/pull/2231) -- Merge pull request #2443 from Human-Connection/2237-longer-comments [`#2237`](https://github.com/Human-Connection/Human-Connection/issues/2237) -- fix #2329: Normalize email on login in the backend [`#2329`](https://github.com/Human-Connection/Human-Connection/issues/2329) - Fix #2294 [`#2294`](https://github.com/Human-Connection/Human-Connection/issues/2294) - Merge pull request #2078 from Human-Connection/fix-2042-back-link [`#2042`](https://github.com/Human-Connection/Human-Connection/issues/2042) -- Move components to components/features [`2357028`](https://github.com/Human-Connection/Human-Connection/commit/235702867d97b44dac37f8059f9194e23ba7f47d) -- Basic Search Is Working For Users And Posts [`72e4d0a`](https://github.com/Human-Connection/Human-Connection/commit/72e4d0abbcb9abab07f3fd12876453eb1de5da4c) -- Add missing unit tests/refactor code [`b364065`](https://github.com/Human-Connection/Human-Connection/commit/b3640659bb608cc34edc6f2aca350f07dd2b9ce6) +- Tell github-linguists to ignore snapshots [`978347b`](https://github.com/Human-Connection/Human-Connection/commit/978347ba7b5a6aa1bc915ada972ffffa2816d37c) +- Lokalise: update of webapp/locales/ru.json [`906e851`](https://github.com/Human-Connection/Human-Connection/commit/906e8518bf060134150187fb1574ac50ffd502f6) +- set up global localVue [`77f4810`](https://github.com/Human-Connection/Human-Connection/commit/77f4810ddc963386bc68d3e8a5e078ef4cf270b2) #### [v0.1.10](https://github.com/Human-Connection/Human-Connection/compare/v0.1.9...v0.1.10) @@ -952,7 +1107,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). #### [v0.1.8](https://github.com/Human-Connection/Human-Connection/compare/v0.1.7...v0.1.8) -> 25 October 2019 +> 24 October 2019 - add FAQ _blank-href in Footer [`#2028`](https://github.com/Human-Connection/Human-Connection/pull/2028) - fix: Don't attempt to save locale if not authenticated [`#2025`](https://github.com/Human-Connection/Human-Connection/pull/2025) @@ -968,9 +1123,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - build(deps-dev): bump @storybook/addon-a11y from 5.2.4 to 5.2.5 in /webapp [`#1989`](https://github.com/Human-Connection/Human-Connection/pull/1989) - build(deps-dev): bump @vue/cli-shared-utils from 4.0.4 to 4.0.5 in /webapp [`#2002`](https://github.com/Human-Connection/Human-Connection/pull/2002) - Update to version 0.1.7 [`#2015`](https://github.com/Human-Connection/Human-Connection/pull/2015) -- Update to version 0.1.8 [`d45264b`](https://github.com/Human-Connection/Human-Connection/commit/d45264b3afa1557c2205e7ca1b77c778ee37ab5a) - build(deps): bump @nuxtjs/apollo in /webapp [`26c21b5`](https://github.com/Human-Connection/Human-Connection/commit/26c21b5b76c96206d98ff6bbfdbd1ca973ffcd4f) - Finish redesign of moderators report list [`15d28aa`](https://github.com/Human-Connection/Human-Connection/commit/15d28aa8ef84788aa640aac67838380bfacf63b7) +- build(deps-dev): bump @storybook/addon-actions in /webapp [`7e95d37`](https://github.com/Human-Connection/Human-Connection/commit/7e95d376a311a5ede6351d577d30e25aea9cb65d) #### [v0.1.7](https://github.com/Human-Connection/Human-Connection/compare/v0.1.6...v0.1.7) @@ -1271,7 +1426,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Run with tag 0.1.0 [`c634ad2`](https://github.com/Human-Connection/Human-Connection/commit/c634ad264bd99dd1a87a86f870d7877aa751dc38) - zwischenspeichern [`e4c7c11`](https://github.com/Human-Connection/Human-Connection/commit/e4c7c1125da6f8fa259241b4d3838b1e7b1e24a2) -#### v0.1.0 +#### [v0.1.0](https://github.com/Human-Connection/Human-Connection/compare/0.1.0...v0.1.0) > 18 September 2019 @@ -1318,6 +1473,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Add styleguide as submodule [`#1559`](https://github.com/Human-Connection/Human-Connection/pull/1559) - Push all docker images at VERSION to dockerhub [`#1558`](https://github.com/Human-Connection/Human-Connection/pull/1558) - II Add Date to Terms and Conditions #1535 [`#1556`](https://github.com/Human-Connection/Human-Connection/pull/1556) +- Fix #1616 [`#1616`](https://github.com/Human-Connection/Human-Connection/issues/1616) +- Fix #1555 [`#1555`](https://github.com/Human-Connection/Human-Connection/issues/1555) +- Refactor Moderator spec tp use apollo-server-testing [`a6f4362`](https://github.com/Human-Connection/Human-Connection/commit/a6f4362a3f439bc3962c736aec517b7c8172a2d8) +- Delete dead code [`94599c6`](https://github.com/Human-Connection/Human-Connection/commit/94599c624b77253720b6a3a7f87069737e621e1a) +- adapt template to follow human connection styleguide (wip) [`61ce274`](https://github.com/Human-Connection/Human-Connection/commit/61ce27464c68836ba6e73638889694c5e3e88dbf) + +#### 0.1.0 + +> 12 September 2019 + - 🍰 [Helper] Message for backend tests failed by missing constraints [`#1553`](https://github.com/Human-Connection/Human-Connection/pull/1553) - Various changes to build pipeline [`#1543`](https://github.com/Human-Connection/Human-Connection/pull/1543) - Fix navbar styling [`#1557`](https://github.com/Human-Connection/Human-Connection/pull/1557) @@ -2373,8 +2538,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Delete docker-compose.yml [`#23`](https://github.com/Human-Connection/Human-Connection/pull/23) - Create .gitignore [`#22`](https://github.com/Human-Connection/Human-Connection/pull/22) - Update README.md [`#13`](https://github.com/Human-Connection/Human-Connection/pull/13) -- Fix #1616 [`#1616`](https://github.com/Human-Connection/Human-Connection/issues/1616) -- Fix #1555 [`#1555`](https://github.com/Human-Connection/Human-Connection/issues/1555) - Merge pull request #1508 from Human-Connection/1505_remove_html_in_moderation_view [`#1505`](https://github.com/Human-Connection/Human-Connection/issues/1505) - Fix #1506 [`#1506`](https://github.com/Human-Connection/Human-Connection/issues/1506) - Fix #1505 remove html [`#1505`](https://github.com/Human-Connection/Human-Connection/issues/1505) @@ -2408,6 +2571,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - Merge pull request #104 from DakshMiglani/master [`#41`](https://github.com/Human-Connection/Human-Connection/issues/41) - Merge pull request #93 from Gerald1614/500_error_on_login [`#49`](https://github.com/Human-Connection/Human-Connection/issues/49) - Update schema.graphql [`#7`](https://github.com/Human-Connection/Human-Connection/issues/7) -- Refactore the import and hashtags to all unicode characters [`0bc4c55`](https://github.com/Human-Connection/Human-Connection/commit/0bc4c558ae8f01d6d975b8ee1ea7f0f42b056d91) - Change strategy, only build docker image [`d6b7374`](https://github.com/Human-Connection/Human-Connection/commit/d6b7374ddbf497bdb5cbc935b88ae085c38b3237) - Copy package.json from webapp/ [`f3a9996`](https://github.com/Human-Connection/Human-Connection/commit/f3a9996962e5dd8b2e365a032c1a5766fe666103) +- Suggestions implemented II [`a5f4480`](https://github.com/Human-Connection/Human-Connection/commit/a5f448036c6fe14015154e462a1381a01df55b15) diff --git a/backend/.env.template b/backend/.env.template index b4c91da9a..8531e6cd7 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -17,3 +17,9 @@ PRIVATE_KEY_PASSPHRASE="a7dsf78sadg87ad87sfagsadg78" SENTRY_DSN_BACKEND= COMMIT= PUBLIC_REGISTRATION=false + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_ENDPOINT= +AWS_REGION= +AWS_BUCKET= diff --git a/backend/package.json b/backend/package.json index 9805cb725..9110c8d13 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "human-connection-backend", - "version": "0.5.0", + "version": "0.6.1", "description": "GraphQL Backend for Human Connection", "main": "src/index.js", "scripts": { @@ -38,19 +38,20 @@ }, "dependencies": { "@hapi/joi": "^17.1.1", - "@sentry/node": "^5.14.2", + "@sentry/node": "^5.15.4", "apollo-cache-inmemory": "~1.6.5", "apollo-client": "~2.6.8", - "apollo-link-context": "~1.0.19", - "apollo-link-http": "~1.5.16", + "apollo-link-context": "~1.0.20", + "apollo-link-http": "~1.5.17", "apollo-server": "~2.11.0", - "apollo-server-express": "^2.11.0", + "apollo-server-express": "^2.12.0", + "aws-sdk": "^2.652.0", "babel-plugin-transform-runtime": "^6.23.0", "bcryptjs": "~2.4.3", "cheerio": "~1.0.0-rc.3", "cors": "~2.8.5", "cross-env": "~7.0.2", - "date-fns": "2.11.0", + "date-fns": "2.11.1", "debug": "~4.1.1", "dotenv": "~8.2.0", "express": "^4.17.1", @@ -61,31 +62,32 @@ "graphql-middleware": "~4.0.2", "graphql-middleware-sentry": "^3.2.1", "graphql-redis-subscriptions": "^2.2.1", - "graphql-shield": "~7.2.1", + "graphql-shield": "~7.2.2", "graphql-tag": "~2.10.3", - "helmet": "~3.21.3", - "ioredis": "^4.16.0", + "helmet": "~3.22.0", + "ioredis": "^4.16.1", "jsonwebtoken": "~8.5.1", "linkifyjs": "~2.1.8", "lodash": "~4.17.14", - "merge-graphql-schemas": "^1.7.6", - "metascraper": "^5.11.6", - "metascraper-audio": "^5.11.6", - "metascraper-author": "^5.11.6", + "merge-graphql-schemas": "^1.7.7", + "metascraper": "^5.11.8", + "metascraper-audio": "^5.11.8", + "metascraper-author": "^5.11.8", "metascraper-clearbit-logo": "^5.3.0", - "metascraper-date": "^5.11.6", + "metascraper-date": "^5.11.8", "metascraper-description": "^5.11.6", - "metascraper-image": "^5.11.6", - "metascraper-lang": "^5.11.6", + "metascraper-image": "^5.11.8", + "metascraper-lang": "^5.11.8", "metascraper-lang-detector": "^4.10.2", "metascraper-logo": "^5.11.6", - "metascraper-publisher": "^5.11.6", - "metascraper-soundcloud": "^5.11.7", - "metascraper-title": "^5.11.6", - "metascraper-url": "^5.11.6", - "metascraper-video": "^5.11.6", - "metascraper-youtube": "^5.11.6", + "metascraper-publisher": "^5.11.8", + "metascraper-soundcloud": "^5.11.8", + "metascraper-title": "^5.11.8", + "metascraper-url": "^5.11.8", + "metascraper-video": "^5.11.8", + "metascraper-youtube": "^5.11.8", "migrate": "^1.6.2", + "mime-types": "^2.1.26", "minimatch": "^3.0.4", "mustache": "^4.0.1", "neo4j-driver": "^4.0.2", @@ -100,36 +102,36 @@ "slug": "~2.1.1", "subscriptions-transport-ws": "^0.9.16", "trunc-html": "~1.1.2", - "uuid": "~7.0.2", + "uuid": "~7.0.3", "validator": "^13.0.0", "wait-on": "~4.0.1", "xregexp": "^4.3.0" }, "devDependencies": { "@babel/cli": "~7.8.4", - "@babel/core": "~7.8.7", + "@babel/core": "~7.9.0", "@babel/node": "~7.8.7", "@babel/plugin-proposal-throw-expressions": "^7.8.3", - "@babel/preset-env": "~7.8.7", - "@babel/register": "^7.8.6", + "@babel/preset-env": "~7.9.5", + "@babel/register": "^7.9.0", "apollo-server-testing": "~2.11.0", "babel-core": "~7.0.0-0", "babel-eslint": "~10.1.0", - "babel-jest": "~25.1.0", + "babel-jest": "~25.2.6", "chai": "~4.2.0", "cucumber": "~6.0.5", "eslint": "~6.8.0", - "eslint-config-prettier": "~6.10.0", - "eslint-config-standard": "~14.1.0", - "eslint-plugin-import": "~2.20.1", + "eslint-config-prettier": "~6.10.1", + "eslint-config-standard": "~14.1.1", + "eslint-plugin-import": "~2.20.2", "eslint-plugin-jest": "~23.8.2", - "eslint-plugin-node": "~11.0.0", + "eslint-plugin-node": "~11.1.0", "eslint-plugin-prettier": "~3.1.2", "eslint-plugin-promise": "~4.2.1", "eslint-plugin-standard": "~4.0.1", - "jest": "~25.1.0", + "jest": "~25.3.0", "nodemon": "~2.0.2", - "prettier": "~1.19.1", + "prettier": "~2.0.4", "rosie": "^2.0.1", "supertest": "~4.0.2" }, diff --git a/backend/src/activitypub/ActivityPub.js b/backend/src/activitypub/ActivityPub.js index c4ad7f4b3..7ecc9d3fe 100644 --- a/backend/src/activitypub/ActivityPub.js +++ b/backend/src/activitypub/ActivityPub.js @@ -202,14 +202,14 @@ export default class ActivityPub { debug('is public addressed') const sharedInboxEndpoints = await this.dataSource.getSharedInboxEndpoints() // serve shared inbox endpoints - sharedInboxEndpoints.map(sharedInbox => { + sharedInboxEndpoints.map((sharedInbox) => { return this.trySend(activity, fromName, new URL(sharedInbox).host, sharedInbox) }) - activity.to = activity.to.filter(recipient => { + activity.to = activity.to.filter((recipient) => { return !isPublicAddressed({ to: recipient }) }) // serve the rest - activity.to.map(async recipient => { + activity.to.map(async (recipient) => { debug('serve rest') const actorObject = await this.getActorObject(recipient) return this.trySend(activity, fromName, new URL(recipient).host, actorObject.inbox) @@ -219,7 +219,7 @@ export default class ActivityPub { const actorObject = await this.getActorObject(activity.to) return this.trySend(activity, fromName, new URL(activity.to).host, actorObject.inbox) } else if (Array.isArray(activity.to)) { - activity.to.map(async recipient => { + activity.to.map(async (recipient) => { const actorObject = await this.getActorObject(recipient) return this.trySend(activity, fromName, new URL(recipient).host, actorObject.inbox) }) @@ -231,7 +231,7 @@ export default class ActivityPub { return await signAndSend(activity, fromName, host, url) } catch (e) { if (tries > 0) { - setTimeout(function() { + setTimeout(function () { return this.trySend(activity, fromName, host, url, --tries) }, 20000) } diff --git a/backend/src/activitypub/NitroDataSource.js b/backend/src/activitypub/NitroDataSource.js index dfdbf6c14..2df895f58 100644 --- a/backend/src/activitypub/NitroDataSource.js +++ b/backend/src/activitypub/NitroDataSource.js @@ -99,7 +99,7 @@ export default class NitroDataSource { followersCollection.totalItems = followersCount debug(`followers = ${JSON.stringify(followers, null, 2)}`) await Promise.all( - followers.map(async follower => { + followers.map(async (follower) => { followersCollection.orderedItems.push(constructIdFromName(follower.slug)) }), ) @@ -161,7 +161,7 @@ export default class NitroDataSource { followingCollection.totalItems = followingCount await Promise.all( - following.map(async user => { + following.map(async (user) => { followingCollection.orderedItems.push(await constructIdFromName(user.slug)) }), ) @@ -238,7 +238,7 @@ export default class NitroDataSource { const outboxCollection = createOrderedCollectionPage(slug, 'outbox') outboxCollection.totalItems = posts.length await Promise.all( - posts.map(async post => { + posts.map(async (post) => { outboxCollection.orderedItems.push( await createArticleObject( post.activityId, @@ -283,7 +283,7 @@ export default class NitroDataSource { orderedItems = onlyNewestItem ? [orderedItems.pop()] : orderedItems return Promise.all( - orderedItems.map(async follower => { + orderedItems.map(async (follower) => { debug(`follower = ${follower}`) const fromUserId = await this.ensureUser(follower) debug(`fromUserId = ${fromUserId}`) @@ -311,7 +311,7 @@ export default class NitroDataSource { const fromUserId = await this.ensureUser(constructIdFromName(fromUserName)) orderedItems = onlyNewestItem ? [orderedItems.pop()] : orderedItems return Promise.all( - orderedItems.map(async following => { + orderedItems.map(async (following) => { debug(`follower = ${following}`) const toUserId = await this.ensureUser(following) debug(`fromUserId = ${fromUserId}`) @@ -343,10 +343,7 @@ export default class NitroDataSource { } const title = postObject.summary ? postObject.summary - : postObject.content - .split(' ') - .slice(0, 5) - .join(' ') + : postObject.content.split(' ').slice(0, 5).join(' ') const postId = extractIdFromActivityId(postObject.id) debug('inside create post') let result = await this.client.mutate({ @@ -560,10 +557,7 @@ export default class NitroDataSource { debug('ensureUser: user not exists.. createUser') // user does not exist.. create it const pw = crypto.randomBytes(16).toString('hex') - const slug = name - .toLowerCase() - .split(' ') - .join('-') + const slug = name.toLowerCase().split(' ').join('-') const result = await this.client.mutate({ mutation: gql` mutation { diff --git a/backend/src/activitypub/routes/inbox.js b/backend/src/activitypub/routes/inbox.js index 18f1890af..f0f88f7e6 100644 --- a/backend/src/activitypub/routes/inbox.js +++ b/backend/src/activitypub/routes/inbox.js @@ -7,7 +7,7 @@ const router = express.Router() // Shared Inbox endpoint (federated Server) // For now its only able to handle Note Activities!! -router.post('/', async function(req, res, next) { +router.post('/', async function (req, res, next) { debug(`Content-Type = ${req.get('Content-Type')}`) debug(`body = ${JSON.stringify(req.body, null, 2)}`) debug(`Request headers = ${JSON.stringify(req.headers, null, 2)}`) diff --git a/backend/src/activitypub/routes/index.js b/backend/src/activitypub/routes/index.js index fb4037004..00ba7c22d 100644 --- a/backend/src/activitypub/routes/index.js +++ b/backend/src/activitypub/routes/index.js @@ -4,7 +4,7 @@ import express from 'express' import cors from 'cors' import verify from './verify' -export default function() { +export default function () { const router = express.Router() router.use( '/activitypub/users', diff --git a/backend/src/activitypub/routes/serveUser.js b/backend/src/activitypub/routes/serveUser.js index 6f4472235..dd7d80811 100644 --- a/backend/src/activitypub/routes/serveUser.js +++ b/backend/src/activitypub/routes/serveUser.js @@ -21,7 +21,7 @@ export async function serveUser(req, res, next) { } `, }) - .catch(reason => { + .catch((reason) => { debug(`serveUser User fetch error: ${reason}`) }) diff --git a/backend/src/activitypub/routes/user.js b/backend/src/activitypub/routes/user.js index 84486fd19..8dfdbc91d 100644 --- a/backend/src/activitypub/routes/user.js +++ b/backend/src/activitypub/routes/user.js @@ -7,7 +7,7 @@ import verify from './verify' const router = express.Router() const debug = require('debug')('ea:user') -router.get('/:name', async function(req, res, next) { +router.get('/:name', async function (req, res, next) { debug('inside user.js -> serveUser') await serveUser(req, res, next) }) @@ -45,7 +45,7 @@ router.get('/:name/outbox', (req, res) => { } }) -router.post('/:name/inbox', verify, async function(req, res, next) { +router.post('/:name/inbox', verify, async function (req, res, next) { debug(`body = ${JSON.stringify(req.body, null, 2)}`) debug(`actorId = ${req.body.actor}`) // const result = await saveActorId(req.body.actor) diff --git a/backend/src/activitypub/routes/webfinger.js b/backend/src/activitypub/routes/webfinger.js index c2cb96a6d..e624d306a 100644 --- a/backend/src/activitypub/routes/webfinger.js +++ b/backend/src/activitypub/routes/webfinger.js @@ -5,7 +5,7 @@ import cors from 'cors' const debug = require('debug')('ea:webfinger') const regex = /acct:([a-z0-9_-]*)@([a-z0-9_-]*)/ -const createWebFinger = name => { +const createWebFinger = (name) => { const { host } = new URL(CONFIG.CLIENT_URI) return { subject: `acct:${name}@${host}`, @@ -30,11 +30,11 @@ export async function handler(req, res) { const session = req.app.get('driver').session() try { - const [slug] = await session.readTransaction(async t => { + const [slug] = await session.readTransaction(async (t) => { const result = await t.run('MATCH (u:User {slug: $slug}) RETURN u.slug AS slug', { slug: name, }) - return result.records.map(record => record.get('slug')) + return result.records.map((record) => record.get('slug')) }) if (!slug) return res.status(404).json({ @@ -52,7 +52,7 @@ export async function handler(req, res) { } } -export default function() { +export default function () { const router = express.Router() router.use('/webfinger', cors(), express.urlencoded({ extended: true }), handler) return router diff --git a/backend/src/activitypub/routes/webfinger.spec.js b/backend/src/activitypub/routes/webfinger.spec.js index 3cd9613e7..213c1ab33 100644 --- a/backend/src/activitypub/routes/webfinger.spec.js +++ b/backend/src/activitypub/routes/webfinger.spec.js @@ -13,7 +13,7 @@ const request = () => { res = { status, contentType } const req = { app: { - get: key => { + get: (key) => { return { driver, }[key] diff --git a/backend/src/activitypub/security/index.js b/backend/src/activitypub/security/index.js index 9e0a63d22..399bc7d9b 100644 --- a/backend/src/activitypub/security/index.js +++ b/backend/src/activitypub/security/index.js @@ -69,7 +69,7 @@ export function verifySignature(url, headers) { const usedHeaders = headersString.split(' ') const verifyHeaders = {} - Object.keys(headers).forEach(key => { + Object.keys(headers).forEach((key) => { if (usedHeaders.includes(key.toLowerCase())) { verifyHeaders[key.toLowerCase()] = headers[key] } @@ -119,7 +119,7 @@ function httpVerify(pubKey, signature, signingString, algorithm) { // This function can be used to extract the signature,headers,algorithm etc. out of the Signature Header. // Just pass what you want as key function extractKeyValueFromSignatureHeader(signatureHeader, key) { - const keyString = signatureHeader.split(',').filter(el => { + const keyString = signatureHeader.split(',').filter((el) => { return !!el.startsWith(key) })[0] diff --git a/backend/src/activitypub/utils/collection.js b/backend/src/activitypub/utils/collection.js index 29cf69ac2..9cb71fe39 100644 --- a/backend/src/activitypub/utils/collection.js +++ b/backend/src/activitypub/utils/collection.js @@ -60,13 +60,10 @@ export function sendCollection(collectionName, req, res) { function attachThenCatch(promise, res) { return promise - .then(collection => { - res - .status(200) - .contentType('application/activity+json') - .send(collection) + .then((collection) => { + res.status(200).contentType('application/activity+json').send(collection) }) - .catch(err => { + .catch((err) => { debug(`error getting a Collection: = ${err}`) res.status(500).end() }) diff --git a/backend/src/activitypub/utils/index.js b/backend/src/activitypub/utils/index.js index 5f26c635f..aa3ff2101 100644 --- a/backend/src/activitypub/utils/index.js +++ b/backend/src/activitypub/utils/index.js @@ -53,7 +53,7 @@ export function signAndSend(activity, fromName, targetDomain, url) { } `, }) - .then(result => { + .then((result) => { if (result.error) { reject(result.error) } else { diff --git a/backend/src/config/index.js b/backend/src/config/index.js index 398bc6ff2..4c81bb181 100644 --- a/backend/src/config/index.js +++ b/backend/src/config/index.js @@ -18,6 +18,11 @@ const { SMTP_PASSWORD, SENTRY_DSN_BACKEND, COMMIT, + AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, + AWS_ENDPOINT, + AWS_REGION, + AWS_BUCKET, NEO4J_URI = 'bolt://localhost:7687', NEO4J_USERNAME = 'neo4j', NEO4J_PASSWORD = 'neo4j', @@ -36,7 +41,7 @@ export const requiredConfigs = { if (require.resolve) { // are we in a nodejs environment? - Object.entries(requiredConfigs).map(entry => { + Object.entries(requiredConfigs).map((entry) => { if (!entry[1]) { throw new Error(`ERROR: "${entry[0]}" env variable is missing.`) } @@ -64,7 +69,20 @@ export const developmentConfigs = { } export const sentryConfigs = { SENTRY_DSN_BACKEND, COMMIT } -export const redisConfiig = { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } +export const redisConfigs = { REDIS_DOMAIN, REDIS_PORT, REDIS_PASSWORD } + +const S3_CONFIGURED = + AWS_ACCESS_KEY_ID && AWS_SECRET_ACCESS_KEY && AWS_ENDPOINT && AWS_REGION && AWS_BUCKET + +export const s3Configs = { + AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, + AWS_ENDPOINT, + AWS_REGION, + AWS_BUCKET, + S3_CONFIGURED, +} + export default { ...requiredConfigs, ...smtpConfigs, @@ -72,5 +90,6 @@ export default { ...serverConfigs, ...developmentConfigs, ...sentryConfigs, - ...redisConfiig, + ...redisConfigs, + ...s3Configs, } diff --git a/backend/src/db/clean.js b/backend/src/db/clean.js index e658317e2..97a21a055 100644 --- a/backend/src/db/clean.js +++ b/backend/src/db/clean.js @@ -4,7 +4,7 @@ if (process.env.NODE_ENV === 'production') { throw new Error(`You cannot clean the database in production environment!`) } -;(async function() { +;(async function () { try { await cleanDatabase() console.log('Successfully deleted all nodes and relations!') // eslint-disable-line no-console diff --git a/backend/src/db/factories.js b/backend/src/db/factories.js index 010ef67ad..1ebf063ff 100644 --- a/backend/src/db/factories.js +++ b/backend/src/db/factories.js @@ -8,7 +8,7 @@ import CONFIG from '../config/index.js' const neode = getNeode() -const uniqueImageUrl = imageUrl => { +const uniqueImageUrl = (imageUrl) => { const newUrl = new URL(imageUrl, CONFIG.CLIENT_URI) newUrl.search = `random=${uuid()}` return newUrl.toString() @@ -18,7 +18,7 @@ export const cleanDatabase = async (options = {}) => { const { driver = getDriver() } = options const session = driver.session() try { - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run( ` MATCH (everything) @@ -73,7 +73,7 @@ Factory.define('basicUser') .attr('slug', ['slug', 'name'], (slug, name) => { return slug || slugify(name, { lower: true }) }) - .attr('encryptedPassword', ['password'], password => { + .attr('encryptedPassword', ['password'], (password) => { return hashSync(password, 10) }) @@ -104,17 +104,17 @@ Factory.define('user') Factory.define('post') .option('categoryIds', []) - .option('categories', ['categoryIds'], categoryIds => { - if (categoryIds.length) return Promise.all(categoryIds.map(id => neode.find('Category', id))) + .option('categories', ['categoryIds'], (categoryIds) => { + if (categoryIds.length) return Promise.all(categoryIds.map((id) => neode.find('Category', id))) // there must be at least one category return Promise.all([Factory.build('category')]) }) .option('tagIds', []) - .option('tags', ['tagIds'], tagIds => { - return Promise.all(tagIds.map(id => neode.find('Tag', id))) + .option('tags', ['tagIds'], (tagIds) => { + return Promise.all(tagIds.map((id) => neode.find('Tag', id))) }) .option('authorId', null) - .option('author', ['authorId'], authorId => { + .option('author', ['authorId'], (authorId) => { if (authorId) return neode.find('User', authorId) return Factory.build('user') }) @@ -129,7 +129,7 @@ Factory.define('post') imageBlurred: false, imageAspectRatio: 1.333, }) - .attr('pinned', ['pinned'], pinned => { + .attr('pinned', ['pinned'], (pinned) => { // Convert false to null return pinned || null }) @@ -139,7 +139,7 @@ Factory.define('post') .attr('slug', ['slug', 'title'], (slug, title) => { return slug || slugify(title, { lower: true }) }) - .attr('language', ['language'], language => { + .attr('language', ['language'], (language) => { return language || 'en' }) .after(async (buildObject, options) => { @@ -152,8 +152,8 @@ Factory.define('post') ]) await Promise.all([ post.relateTo(author, 'author'), - Promise.all(categories.map(c => c.relateTo(post, 'post'))), - Promise.all(tags.map(t => t.relateTo(post, 'post'))), + Promise.all(categories.map((c) => c.relateTo(post, 'post'))), + Promise.all(tags.map((t) => t.relateTo(post, 'post'))), ]) if (image) await post.relateTo(image, 'image') if (buildObject.pinned) { @@ -165,12 +165,12 @@ Factory.define('post') Factory.define('comment') .option('postId', null) - .option('post', ['postId'], postId => { + .option('post', ['postId'], (postId) => { if (postId) return neode.find('Post', postId) return Factory.build('post') }) .option('authorId', null) - .option('author', ['authorId'], authorId => { + .option('author', ['authorId'], (authorId) => { if (authorId) return neode.find('User', authorId) return Factory.build('user') }) diff --git a/backend/src/db/migrate/store.js b/backend/src/db/migrate/store.js index 02e048c07..f3f7e563f 100644 --- a/backend/src/db/migrate/store.js +++ b/backend/src/db/migrate/store.js @@ -6,14 +6,14 @@ class Store { const { driver } = neode const session = driver.session() // eslint-disable-next-line no-console - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices return Promise.all( [ 'CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])', 'CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])', 'CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])', - ].map(statement => txc.run(statement)), + ].map((statement) => txc.run(statement)), ) }) try { @@ -34,11 +34,11 @@ class Store { async load(next) { const driver = getDriver() const session = driver.session() - const readTxResultPromise = session.readTransaction(async txc => { + const readTxResultPromise = session.readTransaction(async (txc) => { const result = await txc.run( 'MATCH (migration:Migration) RETURN migration {.*} ORDER BY migration.timestamp DESC', ) - return result.records.map(r => r.get('migration')) + return result.records.map((r) => r.get('migration')) }) try { const migrations = await readTxResultPromise @@ -63,9 +63,9 @@ class Store { const driver = getDriver() const session = driver.session() const { migrations } = set - const writeTxResultPromise = session.writeTransaction(txc => { + const writeTxResultPromise = session.writeTransaction((txc) => { return Promise.all( - migrations.map(async migration => { + migrations.map(async (migration) => { const { title, description, timestamp } = migration const properties = { title, description, timestamp } const migrationResult = await txc.run( diff --git a/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js b/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js index 377f971e9..0914d6b22 100644 --- a/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js +++ b/backend/src/db/migrations/20200123150105-merge_duplicate_user_accounts.js @@ -18,13 +18,13 @@ export function up(next) { rxSession .beginTransaction() .pipe( - flatMap(txc => + flatMap((txc) => concat( txc .run('MATCH (email:EmailAddress) RETURN email {.email}') .records() .pipe( - map(record => { + map((record) => { const { email } = record.get('email') const normalizedEmail = normalizeEmail(email) return { email, normalizedEmail } @@ -45,7 +45,7 @@ export function up(next) { ) .records() .pipe( - map(r => ({ + map((r) => ({ oldEmail: email, email: r.get('email'), user: r.get('user'), @@ -54,7 +54,7 @@ export function up(next) { }), ), txc.commit(), - ).pipe(catchError(err => txc.rollback().pipe(throwError(err)))), + ).pipe(catchError((err) => txc.rollback().pipe(throwError(err)))), ), ) .subscribe({ @@ -72,7 +72,7 @@ export function up(next) { console.log('Merging of duplicate users completed') next() }, - error: error => { + error: (error) => { next(new Error(error), null) }, }) diff --git a/backend/src/db/migrations/20200123150110-merge_duplicate_location_nodes.js b/backend/src/db/migrations/20200123150110-merge_duplicate_location_nodes.js index b2d6b260f..66560ec51 100644 --- a/backend/src/db/migrations/20200123150110-merge_duplicate_location_nodes.js +++ b/backend/src/db/migrations/20200123150110-merge_duplicate_location_nodes.js @@ -12,7 +12,7 @@ export function up(next) { rxSession .beginTransaction() .pipe( - flatMap(transaction => + flatMap((transaction) => concat( transaction .run( @@ -23,7 +23,7 @@ export function up(next) { ) .records() .pipe( - map(record => { + map((record) => { const { id: locationId } = record.get('location') return { locationId } }), @@ -40,7 +40,7 @@ export function up(next) { ) .records() .pipe( - map(record => ({ + map((record) => ({ location: record.get('location'), updatedLocation: record.get('updatedLocation'), })), @@ -48,7 +48,7 @@ export function up(next) { }), ), transaction.commit(), - ).pipe(catchError(error => transaction.rollback().pipe(throwError(error)))), + ).pipe(catchError((error) => transaction.rollback().pipe(throwError(error)))), ), ) .subscribe({ @@ -66,7 +66,7 @@ export function up(next) { console.log('Merging of duplicate locations completed') next() }, - error: error => { + error: (error) => { next(new Error(error), null) }, }) diff --git a/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js b/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js index 619e30320..94a2f442d 100644 --- a/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js +++ b/backend/src/db/migrations/20200206190233-swap_latitude_with_longitude.js @@ -8,7 +8,7 @@ values lat=10.0 and lng=53.55, which is close to the horn of Africa, but it is lat=53.55 and lng=10.0 ` -const swap = async function(next) { +const swap = async function (next) { const driver = getDriver() const session = driver.session() const transaction = session.beginTransaction() diff --git a/backend/src/db/migrations/20200207080200-fulltext_index_for_tags.js b/backend/src/db/migrations/20200207080200-fulltext_index_for_tags.js index 5064a8b17..ffcd3d4b6 100644 --- a/backend/src/db/migrations/20200207080200-fulltext_index_for_tags.js +++ b/backend/src/db/migrations/20200207080200-fulltext_index_for_tags.js @@ -15,12 +15,18 @@ export async function up(next) { await transaction.commit() next() } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - await transaction.rollback() - // eslint-disable-next-line no-console - console.log('rolled back') - throw new Error(error) + const { message } = error + if (message.includes('There already exists an index')) { + // all fine + // eslint-disable-next-line no-console + console.log(message) + next() + } else { + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } } finally { session.close() } diff --git a/backend/src/db/migrations/20200213230248-add_unique_index_to_image_url.js b/backend/src/db/migrations/20200213230248-add_unique_index_to_image_url.js index 60d67432f..4582d938c 100644 --- a/backend/src/db/migrations/20200213230248-add_unique_index_to_image_url.js +++ b/backend/src/db/migrations/20200213230248-add_unique_index_to_image_url.js @@ -19,11 +19,18 @@ export async function up(next) { await transaction.commit() next() } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - await transaction.rollback() - // eslint-disable-next-line no-console - console.log('rolled back') + const { message } = error + if (message.includes('There already exists an index')) { + // all fine + // eslint-disable-next-line no-console + console.log(message) + next() + } else { + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } } finally { session.close() } diff --git a/backend/src/db/migrations/20200312140328-bulk_upload_to_s3.js b/backend/src/db/migrations/20200312140328-bulk_upload_to_s3.js new file mode 100644 index 000000000..ee9aba023 --- /dev/null +++ b/backend/src/db/migrations/20200312140328-bulk_upload_to_s3.js @@ -0,0 +1,107 @@ +import { getDriver } from '../../db/neo4j' +import { existsSync, createReadStream } from 'fs' +import path from 'path' +import { S3 } from 'aws-sdk' +import mime from 'mime-types' +import { s3Configs } from '../../config' +import https from 'https' + +export const description = ` +Upload all image files to a S3 compatible object storage in order to reduce +load on our backend. +` + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + const agent = new https.Agent({ + maxSockets: 5, + }) + + const { + AWS_ENDPOINT: endpoint, + AWS_REGION: region, + AWS_BUCKET: Bucket, + S3_CONFIGURED, + } = s3Configs + + if (!S3_CONFIGURED) { + // eslint-disable-next-line no-console + console.log('No S3 given, cannot upload image files') + return + } + + const s3 = new S3({ region, endpoint, httpOptions: { agent } }) + try { + // Implement your migration here. + const { records } = await transaction.run('MATCH (image:Image) RETURN image.url as url') + let urls = records.map((r) => r.get('url')) + urls = urls.filter((url) => url.startsWith('/uploads')) + const locations = await Promise.all( + urls + .map((url) => { + return async () => { + const { pathname } = new URL(url, 'http://example.org') + const fileLocation = path.join(__dirname, `../../../public/${pathname}`) + const s3Location = `original${pathname}` + if (existsSync(fileLocation)) { + const mimeType = mime.lookup(fileLocation) + const params = { + Bucket, + Key: s3Location, + ACL: 'public-read', + ContentType: mimeType || 'image/jpeg', + Body: createReadStream(fileLocation), + } + + const data = await s3.upload(params).promise() + const { Location: spacesUrl } = data + + const updatedRecord = await transaction.run( + 'MATCH (image:Image {url: $url}) SET image.url = $spacesUrl RETURN image.url as url', + { url, spacesUrl }, + ) + const [updatedUrl] = updatedRecord.records.map((record) => record.get('url')) + return updatedUrl + } + } + }) + .map((p) => p()), + ) + // eslint-disable-next-line no-console + console.log('this is locations', locations) + await transaction.commit() + next() + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } finally { + session.close() + } +} + +export async function down(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + await transaction.run(``) + await transaction.commit() + next() + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + } finally { + session.close() + } +} diff --git a/backend/src/db/migrations/20200320200315-refactor_all_images_to_separate_type.js b/backend/src/db/migrations/20200320200315-refactor_all_images_to_separate_type.js index 9a0a5c30d..1ad5e645d 100644 --- a/backend/src/db/migrations/20200320200315-refactor_all_images_to_separate_type.js +++ b/backend/src/db/migrations/20200320200315-refactor_all_images_to_separate_type.js @@ -6,9 +6,9 @@ export const description = ` "Image" which contains metadata and image file urls. ` -const printSummaries = summaries => { +const printSummaries = (summaries) => { console.log('=========================================') - summaries.forEach(stat => { + summaries.forEach((stat) => { console.log(stat.query.text) console.log(JSON.stringify(stat.counters, null, 2)) }) @@ -18,7 +18,7 @@ const printSummaries = summaries => { export async function up() { const driver = getDriver() const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { const runs = await Promise.all( [ ` @@ -48,7 +48,7 @@ export async function up() { CREATE (user)-[:COVER_IMAGE]->(coverImage) REMOVE user.coverImg `, - ].map(s => txc.run(s)), + ].map((s) => txc.run(s)), ) return runs.map(({ summary }) => summary) }) @@ -65,7 +65,7 @@ export async function up() { export async function down() { const driver = getDriver() const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { const runs = await Promise.all( [ ` @@ -86,7 +86,7 @@ export async function down() { SET user.coverImg = coverImage.url DETACH DELETE coverImage `, - ].map(s => txc.run(s)), + ].map((s) => txc.run(s)), ) return runs.map(({ summary }) => summary) }) diff --git a/backend/src/db/migrations/20200323140300-remove_deleted_users_obsolete_attributes.js b/backend/src/db/migrations/20200323140300-remove_deleted_users_obsolete_attributes.js index 8b2134dc5..e4852f79c 100644 --- a/backend/src/db/migrations/20200323140300-remove_deleted_users_obsolete_attributes.js +++ b/backend/src/db/migrations/20200323140300-remove_deleted_users_obsolete_attributes.js @@ -20,7 +20,7 @@ export async function up(next) { `) try { // Implement your migration here. - const users = await updateDeletedUserAttributes.records.map(record => record.get('user')) + const users = await updateDeletedUserAttributes.records.map((record) => record.get('user')) // eslint-disable-next-line no-console console.log(users) await transaction.commit() diff --git a/backend/src/db/migrations/20200323160336-remove_deleted_posts_obsolete_attributes.js b/backend/src/db/migrations/20200323160336-remove_deleted_posts_obsolete_attributes.js index 07abf9aeb..8c1efe5c6 100644 --- a/backend/src/db/migrations/20200323160336-remove_deleted_posts_obsolete_attributes.js +++ b/backend/src/db/migrations/20200323160336-remove_deleted_posts_obsolete_attributes.js @@ -22,7 +22,7 @@ export async function up(next) { `) try { // Implement your migration here. - const posts = await updateDeletedPostsAttributes.records.map(record => record.get('post')) + const posts = await updateDeletedPostsAttributes.records.map((record) => record.get('post')) // eslint-disable-next-line no-console console.log(posts) await transaction.commit() diff --git a/backend/src/db/migrations/20200326160326-remove_dangling_image_urls.js b/backend/src/db/migrations/20200326160326-remove_dangling_image_urls.js new file mode 100644 index 000000000..a77ac360c --- /dev/null +++ b/backend/src/db/migrations/20200326160326-remove_dangling_image_urls.js @@ -0,0 +1,61 @@ +import { getDriver } from '../../db/neo4j' +import { existsSync } from 'fs' + +export const description = ` + In this review: + https://github.com/Human-Connection/Human-Connection/pull/3262#discussion_r398634249 + I brought up that we may have image nodes with danling urls (urls that don't + point to local file on disk). I would prefer to remove those urls to avoid + unnecessary 404 errors. +` + +export async function up(next) { + const driver = getDriver() + const session = driver.session() + const transaction = session.beginTransaction() + + try { + // Implement your migration here. + const { records } = await transaction.run(` + MATCH(image:Image) + WHERE image.url STARTS WITH '/' + RETURN image.url as url + `) + const urls = records.map((record) => record.get('url')) + const danglingUrls = urls.filter((url) => { + const fileLocation = `public${url}` + return !existsSync(fileLocation) + }) + await transaction.run( + ` + MATCH(image:Image) + WHERE image.url IN $danglingUrls + DETACH DELETE image + `, + { danglingUrls }, + ) + await transaction.commit() + if (danglingUrls.length) { + // eslint-disable-next-line no-console + console.log(` + Removed ${danglingUrls.length} dangling urls.\n + =============================================== + ${danglingUrls.join('\n')} + `) + } + next() + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + await transaction.rollback() + // eslint-disable-next-line no-console + console.log('rolled back') + throw new Error(error) + } finally { + session.close() + } +} + +export async function down() { + throw new Error('Irreversible migration') +} diff --git a/backend/src/db/seed.js b/backend/src/db/seed.js index 953f80b55..685b5ef0e 100644 --- a/backend/src/db/seed.js +++ b/backend/src/db/seed.js @@ -9,7 +9,7 @@ import { gql } from '../helpers/jest' const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] /* eslint-disable no-multi-spaces */ -;(async function() { +;(async function () { let authenticatedUser = null const driver = getDriver() const neode = getNeode() @@ -598,7 +598,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] }), ]) const [p2, p7, p8, p12] = await Promise.all( - ['p2', 'p7', 'p8', 'p12'].map(id => neode.find('Post', id)), + ['p2', 'p7', 'p8', 'p12'].map((id) => neode.find('Post', id)), ) authenticatedUser = null @@ -928,7 +928,15 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] trollingComment.update({ disabled: true, updatedAt: new Date().toISOString(), closed: true }), ]) - await Promise.all([...Array(30).keys()].map(() => Factory.build('user'))) + const additionalUsers = await Promise.all( + [...Array(30).keys()].map(() => Factory.build('user')), + ) + await Promise.all( + additionalUsers.map(async (user) => { + await jennyRostock.relateTo(user, 'following') + await user.relateTo(jennyRostock, 'following') + }), + ) await Promise.all( [...Array(30).keys()].map(() => diff --git a/backend/src/helpers/encryptPassword.js b/backend/src/helpers/encryptPassword.js index ae98af84f..657dee98a 100644 --- a/backend/src/helpers/encryptPassword.js +++ b/backend/src/helpers/encryptPassword.js @@ -1,6 +1,6 @@ import { hashSync } from 'bcryptjs' -export default function(args) { +export default function (args) { args.encryptedPassword = hashSync(args.password, 10) delete args.password return args diff --git a/backend/src/helpers/walkRecursive.js b/backend/src/helpers/walkRecursive.js index db9a4c703..85900eeba 100644 --- a/backend/src/helpers/walkRecursive.js +++ b/backend/src/helpers/walkRecursive.js @@ -18,7 +18,7 @@ function walkRecursive(data, fields, callback, _key) { }) } else if (data && typeof data === 'object') { // lets get some keys and stir them - Object.keys(data).forEach(k => { + Object.keys(data).forEach((k) => { data[k] = walkRecursive(data[k], fields, callback, k) }) } diff --git a/backend/src/jwt/decode.js b/backend/src/jwt/decode.js index 8dbcb080d..e02dcc8d4 100644 --- a/backend/src/jwt/decode.js +++ b/backend/src/jwt/decode.js @@ -13,7 +13,7 @@ export default async (driver, authorizationHeader) => { } const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const updateUserLastActiveTransactionResponse = await transaction.run( ` MATCH (user:User {id: $id, deleted: false, disabled: false }) @@ -23,7 +23,7 @@ export default async (driver, authorizationHeader) => { `, { id }, ) - return updateUserLastActiveTransactionResponse.records.map(record => record.get('user')) + return updateUserLastActiveTransactionResponse.records.map((record) => record.get('user')) }) try { const [currentUser] = await writeTxResultPromise diff --git a/backend/src/middleware/email/emailMiddleware.js b/backend/src/middleware/email/emailMiddleware.js index f92da3368..a69530582 100644 --- a/backend/src/middleware/email/emailMiddleware.js +++ b/backend/src/middleware/email/emailMiddleware.js @@ -18,7 +18,7 @@ if (!hasEmailConfig) { console.log('Warning: Email middleware will not try to send mails.') } } else { - sendMail = async templateArgs => { + sendMail = async (templateArgs) => { const transporter = nodemailer.createTransport({ host: CONFIG.SMTP_HOST, port: CONFIG.SMTP_PORT, diff --git a/backend/src/middleware/email/templates/index.js b/backend/src/middleware/email/templates/index.js index 594cae334..b8ae01bdb 100644 --- a/backend/src/middleware/email/templates/index.js +++ b/backend/src/middleware/email/templates/index.js @@ -1,7 +1,7 @@ import fs from 'fs' import path from 'path' -const readFile = fileName => fs.readFileSync(path.join(__dirname, fileName), 'utf-8') +const readFile = (fileName) => fs.readFileSync(path.join(__dirname, fileName), 'utf-8') export const signup = readFile('./signup.html') export const passwordReset = readFile('./resetPassword.html') diff --git a/backend/src/middleware/hashtags/extractHashtags.js b/backend/src/middleware/hashtags/extractHashtags.js index 9a903e4fa..4c7667557 100644 --- a/backend/src/middleware/hashtags/extractHashtags.js +++ b/backend/src/middleware/hashtags/extractHashtags.js @@ -8,7 +8,7 @@ import { exec, build } from 'xregexp/xregexp-all.js' // 2. If it starts with a digit '0-9' than a unicode letter has to follow. const regX = build('^((\\pL+[\\pL0-9]*)|([0-9]+\\pL+[\\pL0-9]*))$') -export default function(content) { +export default function (content) { if (!content) return [] const $ = cheerio.load(content) // We can not search for class '.hashtag', because the classes are removed at the 'xss' middleware. @@ -19,7 +19,7 @@ export default function(content) { }) .get() const hashtags = [] - ids.forEach(id => { + ids.forEach((id) => { const match = exec(id, regX) if (match != null) { hashtags.push(match[1]) diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.js b/backend/src/middleware/hashtags/hashtagsMiddleware.js index 7d8593fd5..985cd3c92 100644 --- a/backend/src/middleware/hashtags/hashtagsMiddleware.js +++ b/backend/src/middleware/hashtags/hashtagsMiddleware.js @@ -5,7 +5,7 @@ const updateHashtagsOfPost = async (postId, hashtags, context) => { const session = context.driver.session() try { - await session.writeTransaction(txc => { + await session.writeTransaction((txc) => { return txc.run( ` MATCH (post:Post { id: $postId}) diff --git a/backend/src/middleware/includedFieldsMiddleware.js b/backend/src/middleware/includedFieldsMiddleware.js index cd7a74f4e..fd95029b0 100644 --- a/backend/src/middleware/includedFieldsMiddleware.js +++ b/backend/src/middleware/includedFieldsMiddleware.js @@ -2,21 +2,21 @@ import cloneDeep from 'lodash/cloneDeep' const _includeFieldsRecursively = (selectionSet, includedFields) => { if (!selectionSet) return - includedFields.forEach(includedField => { + includedFields.forEach((includedField) => { selectionSet.selections.unshift({ kind: 'Field', name: { kind: 'Name', value: includedField }, }) }) - selectionSet.selections.forEach(selection => { + selectionSet.selections.forEach((selection) => { _includeFieldsRecursively(selection.selectionSet, includedFields) }) } -const includeFieldsRecursively = includedFields => { +const includeFieldsRecursively = (includedFields) => { return (resolve, root, args, context, resolveInfo) => { const copy = cloneDeep(resolveInfo) - copy.fieldNodes.forEach(fieldNode => { + copy.fieldNodes.forEach((fieldNode) => { _includeFieldsRecursively(fieldNode.selectionSet, includedFields) }) return resolve(root, args, context, copy) diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index 25195b1b5..83b0104ec 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -15,7 +15,7 @@ import hashtags from './hashtags/hashtagsMiddleware' import email from './email/emailMiddleware' import sentry from './sentryMiddleware' -export default schema => { +export default (schema) => { const middlewares = { sentry, permissions, @@ -51,7 +51,7 @@ export default schema => { // add permisions middleware at the first position (unless we're seeding) if (CONFIG.DISABLED_MIDDLEWARES) { const disabledMiddlewares = CONFIG.DISABLED_MIDDLEWARES.split(',') - order = order.filter(key => { + order = order.filter((key) => { if (disabledMiddlewares.includes(key)) { /* eslint-disable-next-line no-console */ console.log(`Warning: Disabled "${disabledMiddlewares}" middleware.`) @@ -60,6 +60,6 @@ export default schema => { }) } - const appliedMiddlewares = order.map(key => middlewares[key]) + const appliedMiddlewares = order.map((key) => middlewares[key]) return applyMiddleware(schema, ...appliedMiddlewares) } diff --git a/backend/src/middleware/notifications/mentions/extractMentionedUsers.js b/backend/src/middleware/notifications/mentions/extractMentionedUsers.js index 3ba845043..e7e23ace7 100644 --- a/backend/src/middleware/notifications/mentions/extractMentionedUsers.js +++ b/backend/src/middleware/notifications/mentions/extractMentionedUsers.js @@ -1,6 +1,6 @@ import cheerio from 'cheerio' -export default content => { +export default (content) => { if (!content) return [] const $ = cheerio.load(content) const userIds = $('a.mention[data-mention-id]') @@ -9,7 +9,7 @@ export default content => { }) .get() return userIds - .map(id => id.trim()) - .filter(id => !!id) + .map((id) => id.trim()) + .filter((id) => !!id) .filter((id, index, allIds) => allIds.indexOf(id) === index) } diff --git a/backend/src/middleware/notifications/notificationsMiddleware.js b/backend/src/middleware/notifications/notificationsMiddleware.js index 64eca97c8..c76b9ca0e 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.js +++ b/backend/src/middleware/notifications/notificationsMiddleware.js @@ -6,7 +6,7 @@ const publishNotifications = async (...promises) => { const notifications = await Promise.all(promises) notifications .flat() - .forEach(notificationAdded => pubsub.publish(NOTIFICATION_ADDED, { notificationAdded })) + .forEach((notificationAdded) => pubsub.publish(NOTIFICATION_ADDED, { notificationAdded })) } const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => { @@ -25,7 +25,7 @@ const handleContentDataOfComment = async (resolve, root, args, context, resolveI let idsOfUsers = extractMentionedUsers(content) const comment = await resolve(root, args, context, resolveInfo) const [postAuthor] = await postAuthorOfComment(comment.id, { context }) - idsOfUsers = idsOfUsers.filter(id => id !== postAuthor.id) + idsOfUsers = idsOfUsers.filter((id) => id !== postAuthor.id) await publishNotifications( notifyUsersOfMention('Comment', comment.id, idsOfUsers, 'mentioned_in_comment', context), notifyUsersOfComment('Comment', comment.id, postAuthor.id, 'commented_on_post', context), @@ -37,7 +37,7 @@ const postAuthorOfComment = async (commentId, { context }) => { const session = context.driver.session() let postAuthorId try { - postAuthorId = await session.readTransaction(transaction => { + postAuthorId = await session.readTransaction((transaction) => { return transaction.run( ` MATCH (author:User)-[:WROTE]->(:Post)<-[:COMMENTS]-(:Comment { id: $commentId }) @@ -46,7 +46,7 @@ const postAuthorOfComment = async (commentId, { context }) => { { commentId }, ) }) - return postAuthorId.records.map(record => record.get('authorId')) + return postAuthorId.records.map((record) => record.get('authorId')) } finally { session.close() } @@ -93,13 +93,13 @@ const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => { RETURN notification {.*, from: finalResource, to: properties(user)} ` const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const notificationTransactionResponse = await transaction.run(mentionedCypher, { id, idsOfUsers, reason, }) - return notificationTransactionResponse.records.map(record => record.get('notification')) + return notificationTransactionResponse.records.map((record) => record.get('notification')) }) try { const notifications = await writeTxResultPromise @@ -115,7 +115,7 @@ const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, cont if (context.user.id === postAuthorId) return [] await validateNotifyUsers(label, reason) const session = context.driver.session() - const writeTxResultPromise = await session.writeTransaction(async transaction => { + const writeTxResultPromise = await session.writeTransaction(async (transaction) => { const notificationTransactionResponse = await transaction.run( ` MATCH (postAuthor:User {id: $postAuthorId})-[:WROTE]->(post:Post)<-[:COMMENTS]-(comment:Comment { id: $commentId })<-[:WROTE]-(commenter:User) @@ -130,7 +130,7 @@ const notifyUsersOfComment = async (label, commentId, postAuthorId, reason, cont `, { commentId, postAuthorId, reason }, ) - return notificationTransactionResponse.records.map(record => record.get('notification')) + return notificationTransactionResponse.records.map((record) => record.get('notification')) }) try { const notifications = await writeTxResultPromise diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index fa88d9348..2c8d7ff63 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -47,7 +47,7 @@ const isAuthor = rule({ if (!user) return false const { id: resourceId } = args const session = driver.session() - const authorReadTxPromise = session.readTransaction(async transaction => { + const authorReadTxPromise = session.readTransaction(async (transaction) => { const authorTransactionResponse = await transaction.run( ` MATCH (resource {id: $resourceId})<-[:WROTE]-(author {id: $userId}) @@ -55,7 +55,7 @@ const isAuthor = rule({ `, { resourceId, userId: user.id }, ) - return authorTransactionResponse.records.map(record => record.get('author')) + return authorTransactionResponse.records.map((record) => record.get('author')) }) try { const [author] = await authorReadTxPromise diff --git a/backend/src/middleware/sluggifyMiddleware.js b/backend/src/middleware/sluggifyMiddleware.js index 1cd3c0b9c..165235be9 100644 --- a/backend/src/middleware/sluggifyMiddleware.js +++ b/backend/src/middleware/sluggifyMiddleware.js @@ -1,10 +1,10 @@ import uniqueSlug from './slugify/uniqueSlug' const isUniqueFor = (context, type) => { - return async slug => { + return async (slug) => { const session = context.driver.session() try { - const existingSlug = await session.readTransaction(transaction => { + const existingSlug = await session.readTransaction((transaction) => { return transaction.run( ` MATCH(p:${type} {slug: $slug }) diff --git a/backend/src/middleware/slugify/uniqueSlug.spec.js b/backend/src/middleware/slugify/uniqueSlug.spec.js index e34af86a1..ff14a56ef 100644 --- a/backend/src/middleware/slugify/uniqueSlug.spec.js +++ b/backend/src/middleware/slugify/uniqueSlug.spec.js @@ -9,10 +9,7 @@ describe('uniqueSlug', () => { it('increments slugified string until unique', () => { const string = 'Hello World' - const isUnique = jest - .fn() - .mockResolvedValueOnce(false) - .mockResolvedValueOnce(true) + const isUnique = jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true) expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1') }) diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js index df011b0a5..48c4fb651 100644 --- a/backend/src/middleware/slugifyMiddleware.spec.js +++ b/backend/src/middleware/slugifyMiddleware.spec.js @@ -121,7 +121,7 @@ describe('slugifyMiddleware', () => { }) describe('but if the client specifies a slug', () => { - it('rejects CreatePost', async done => { + it('rejects CreatePost', async (done) => { variables = { ...variables, title: 'Pre-existing post', diff --git a/backend/src/middleware/validation/validationMiddleware.js b/backend/src/middleware/validation/validationMiddleware.js index 948e1a73a..d36e64846 100644 --- a/backend/src/middleware/validation/validationMiddleware.js +++ b/backend/src/middleware/validation/validationMiddleware.js @@ -14,7 +14,7 @@ const validateCreateComment = async (resolve, root, args, context, info) => { } const session = context.driver.session() try { - const postQueryRes = await session.readTransaction(transaction => { + const postQueryRes = await session.readTransaction((transaction) => { return transaction.run( ` MATCH (post:Post {id: $postId}) @@ -23,7 +23,7 @@ const validateCreateComment = async (resolve, root, args, context, info) => { { postId }, ) }) - const [post] = postQueryRes.records.map(record => { + const [post] = postQueryRes.records.map((record) => { return record.get('post') }) @@ -73,7 +73,7 @@ const validateReview = async (resolve, root, args, context, info) => { const { user, driver } = context if (resourceId === user.id) throw new Error('You cannot review yourself!') const session = driver.session() - const reportReadTxPromise = session.readTransaction(async transaction => { + const reportReadTxPromise = session.readTransaction(async (transaction) => { const validateReviewTransactionResponse = await transaction.run( ` MATCH (resource {id: $resourceId}) @@ -87,7 +87,7 @@ const validateReview = async (resolve, root, args, context, info) => { submitterId: user.id, }, ) - return validateReviewTransactionResponse.records.map(record => ({ + return validateReviewTransactionResponse.records.map((record) => ({ label: record.get('label'), author: record.get('author'), filed: record.get('filed'), diff --git a/backend/src/models/User.spec.js b/backend/src/models/User.spec.js index a45a629e5..7d7f391b0 100644 --- a/backend/src/models/User.spec.js +++ b/backend/src/models/User.spec.js @@ -28,7 +28,7 @@ describe('slug', () => { ) }) - it('must be unique', async done => { + it('must be unique', async (done) => { await neode.create('User', { slug: 'Matt' }) try { await expect(neode.create('User', { slug: 'Matt' })).rejects.toThrow('already exists') @@ -52,8 +52,8 @@ describe('slug', () => { }) describe('characters', () => { - const createUser = attrs => { - return neode.create('User', attrs).then(user => user.toJson()) + const createUser = (attrs) => { + return neode.create('User', attrs).then((user) => user.toJson()) } it('-', async () => { diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js index 67a6675c9..a3a0c7290 100644 --- a/backend/src/schema/resolvers/comments.js +++ b/backend/src/schema/resolvers/comments.js @@ -15,7 +15,7 @@ export default { const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const createCommentTransactionResponse = await transaction.run( ` MATCH (post:Post {id: $postId}) @@ -30,7 +30,7 @@ export default { { userId: user.id, postId, params }, ) return createCommentTransactionResponse.records.map( - record => record.get('comment').properties, + (record) => record.get('comment').properties, ) }) try { @@ -42,7 +42,7 @@ export default { }, UpdateComment: async (_parent, params, context, _resolveInfo) => { const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const updateCommentTransactionResponse = await transaction.run( ` MATCH (comment:Comment {id: $params.id}) @@ -53,7 +53,7 @@ export default { { params }, ) return updateCommentTransactionResponse.records.map( - record => record.get('comment').properties, + (record) => record.get('comment').properties, ) }) try { @@ -65,7 +65,7 @@ export default { }, DeleteComment: async (_parent, args, context, _resolveInfo) => { const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const deleteCommentTransactionResponse = await transaction.run( ` MATCH (comment:Comment {id: $commentId}) @@ -77,7 +77,7 @@ export default { { commentId: args.id }, ) return deleteCommentTransactionResponse.records.map( - record => record.get('comment').properties, + (record) => record.get('comment').properties, ) }) try { diff --git a/backend/src/schema/resolvers/donations.js b/backend/src/schema/resolvers/donations.js index 3052ff13d..15a1db812 100644 --- a/backend/src/schema/resolvers/donations.js +++ b/backend/src/schema/resolvers/donations.js @@ -4,7 +4,7 @@ export default { const { driver } = context let donations const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { const updateDonationsTransactionResponse = await txc.run( ` MATCH (donations:Donations) @@ -16,7 +16,7 @@ export default { { params }, ) return updateDonationsTransactionResponse.records.map( - record => record.get('donations').properties, + (record) => record.get('donations').properties, ) }) try { diff --git a/backend/src/schema/resolvers/emails.js b/backend/src/schema/resolvers/emails.js index 8711a5996..7986f2613 100644 --- a/backend/src/schema/resolvers/emails.js +++ b/backend/src/schema/resolvers/emails.js @@ -27,7 +27,7 @@ export default { } = context const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { const result = await txc.run( ` MATCH (user:User {id: $userId}) @@ -37,7 +37,7 @@ export default { `, { userId, email: args.email, nonce }, ) - return result.records.map(record => ({ + return result.records.map((record) => ({ name: record.get('user').properties.name, ...record.get('email').properties, })) @@ -57,7 +57,7 @@ export default { } = context const { nonce, email } = args const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async txc => { + const writeTxResultPromise = session.writeTransaction(async (txc) => { const result = await txc.run( ` MATCH (user:User {id: $userId})-[:PRIMARY_EMAIL]->(previous:EmailAddress) @@ -71,7 +71,7 @@ export default { `, { userId, email, nonce }, ) - return result.records.map(record => record.get('email').properties) + return result.records.map((record) => record.get('email').properties) }) try { const txResult = await writeTxResultPromise diff --git a/backend/src/schema/resolvers/embeds.spec.js b/backend/src/schema/resolvers/embeds.spec.js index 7683505eb..b8215ed72 100644 --- a/backend/src/schema/resolvers/embeds.spec.js +++ b/backend/src/schema/resolvers/embeds.spec.js @@ -48,7 +48,7 @@ describe('Query', () => { let embedAction beforeEach(() => { - embedAction = async variables => { + embedAction = async (variables) => { const { server } = createServer({ context: () => {}, }) diff --git a/backend/src/schema/resolvers/embeds/findProvider.js b/backend/src/schema/resolvers/embeds/findProvider.js index 8575599e1..344cfed51 100644 --- a/backend/src/schema/resolvers/embeds/findProvider.js +++ b/backend/src/schema/resolvers/embeds/findProvider.js @@ -12,11 +12,11 @@ let oEmbedProvidersFile = fs.readFileSync( oEmbedProvidersFile = oEmbedProvidersFile.replace(/\{format\}/g, 'json') const oEmbedProviders = JSON.parse(oEmbedProvidersFile) -export default function(embedUrl) { +export default function (embedUrl) { for (const provider of oEmbedProviders) { for (const endpoint of provider.endpoints) { const { schemes = [], url } = endpoint - if (schemes.some(scheme => minimatch(embedUrl, scheme))) return url + if (schemes.some((scheme) => minimatch(embedUrl, scheme))) return url } const { hostname } = new URL(embedUrl) if (provider.provider_url.includes(hostname)) { diff --git a/backend/src/schema/resolvers/embeds/scraper.js b/backend/src/schema/resolvers/embeds/scraper.js index bbf4fc999..df37611f3 100644 --- a/backend/src/schema/resolvers/embeds/scraper.js +++ b/backend/src/schema/resolvers/embeds/scraper.js @@ -29,7 +29,7 @@ const metascraper = Metascraper([ // require('./rules/metascraper-embed')() ]) -const fetchEmbed = async url => { +const fetchEmbed = async (url) => { let endpointUrl = findProvider(url) if (!endpointUrl) return {} endpointUrl = new URL(endpointUrl) @@ -53,7 +53,7 @@ const fetchEmbed = async url => { } } -const fetchResource = async url => { +const fetchResource = async (url) => { const response = await fetch(url) const html = await response.text() const resource = await metascraper({ html, url }) diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js index 953a26d65..f35795991 100644 --- a/backend/src/schema/resolvers/follow.spec.js +++ b/backend/src/schema/resolvers/follow.spec.js @@ -81,7 +81,7 @@ beforeEach(async () => { email: 'test@example.org', password: '1234', }, - ).then(user => user.toJson()) + ).then((user) => user.toJson()) user2 = await Factory.build( 'user', { @@ -92,7 +92,7 @@ beforeEach(async () => { email: 'test2@example.org', password: '1234', }, - ).then(user => user.toJson()) + ).then((user) => user.toJson()) authenticatedUser = user1 variables = { id: user2.id } @@ -146,7 +146,7 @@ describe('follow', () => { { id: 'u1' }, ) const relationshipProperties = relation.records.map( - record => record.get('relationship').properties.createdAt, + (record) => record.get('relationship').properties.createdAt, ) expect(relationshipProperties[0]).toEqual(expect.any(String)) }) diff --git a/backend/src/schema/resolvers/helpers/Resolver.js b/backend/src/schema/resolvers/helpers/Resolver.js index 64ba60f5e..f2861e7a0 100644 --- a/backend/src/schema/resolvers/helpers/Resolver.js +++ b/backend/src/schema/resolvers/helpers/Resolver.js @@ -1,9 +1,9 @@ import log from './databaseLogger' -export const undefinedToNullResolver = list => { +export const undefinedToNullResolver = (list) => { const resolvers = {} - list.forEach(key => { - resolvers[key] = async parent => { + list.forEach((key) => { + resolvers[key] = async (parent) => { return typeof parent[key] === 'undefined' ? null : parent[key] } }) @@ -25,14 +25,14 @@ export default function Resolver(type, options = {}) { if (typeof parent[key] !== 'undefined') return parent[key] const id = parent[idAttribute] const session = driver.session() - const readTxResultPromise = session.readTransaction(async txc => { + const readTxResultPromise = session.readTransaction(async (txc) => { const cypher = ` MATCH(:${type} {${idAttribute}: $id})${connection} RETURN related {.*} as related ` const result = await txc.run(cypher, { id, cypherParams }) log(result) - return result.records.map(r => r.get('related')) + return result.records.map((r) => r.get('related')) }) try { let response = await readTxResultPromise @@ -44,19 +44,19 @@ export default function Resolver(type, options = {}) { } } - const booleanResolver = obj => { + const booleanResolver = (obj) => { const resolvers = {} for (const [key, condition] of Object.entries(obj)) { resolvers[key] = async (parent, params, { cypherParams, driver }, resolveInfo) => { if (typeof parent[key] !== 'undefined') return parent[key] const id = parent[idAttribute] const session = driver.session() - const readTxResultPromise = session.readTransaction(async txc => { + const readTxResultPromise = session.readTransaction(async (txc) => { const nodeCondition = condition.replace('this', 'this {id: $id}') const cypher = `${nodeCondition} as ${key}` const result = await txc.run(cypher, { id, cypherParams }) log(result) - const [response] = result.records.map(r => r.get(key)) + const [response] = result.records.map((r) => r.get(key)) return response }) try { @@ -69,13 +69,13 @@ export default function Resolver(type, options = {}) { return resolvers } - const countResolver = obj => { + const countResolver = (obj) => { const resolvers = {} for (const [key, connection] of Object.entries(obj)) { resolvers[key] = async (parent, params, { driver, cypherParams }, resolveInfo) => { if (typeof parent[key] !== 'undefined') return parent[key] const session = driver.session() - const readTxResultPromise = session.readTransaction(async txc => { + const readTxResultPromise = session.readTransaction(async (txc) => { const id = parent[idAttribute] const cypher = ` MATCH(u:${type} {${idAttribute}: $id})${connection} @@ -83,7 +83,7 @@ export default function Resolver(type, options = {}) { ` const result = await txc.run(cypher, { id, cypherParams }) log(result) - const [response] = result.records.map(r => r.get('count').toNumber()) + const [response] = result.records.map((r) => r.get('count').toNumber()) return response }) try { @@ -96,7 +96,7 @@ export default function Resolver(type, options = {}) { return resolvers } - const hasManyResolver = obj => { + const hasManyResolver = (obj) => { const resolvers = {} for (const [key, connection] of Object.entries(obj)) { resolvers[key] = _hasResolver(resolvers, { key, connection }, { returnType: 'iterable' }) @@ -104,7 +104,7 @@ export default function Resolver(type, options = {}) { return resolvers } - const hasOneResolver = obj => { + const hasOneResolver = (obj) => { const resolvers = {} for (const [key, connection] of Object.entries(obj)) { resolvers[key] = _hasResolver(resolvers, { key, connection }, { returnType: 'object' }) diff --git a/backend/src/schema/resolvers/helpers/createPasswordReset.js b/backend/src/schema/resolvers/helpers/createPasswordReset.js index dec55c893..ec0349c18 100644 --- a/backend/src/schema/resolvers/helpers/createPasswordReset.js +++ b/backend/src/schema/resolvers/helpers/createPasswordReset.js @@ -5,7 +5,7 @@ export default async function createPasswordReset(options) { const normalizedEmail = normalizeEmail(email) const session = driver.session() try { - const createPasswordResetTxPromise = session.writeTransaction(async transaction => { + const createPasswordResetTxPromise = session.writeTransaction(async (transaction) => { const createPasswordResetTransactionResponse = await transaction.run( ` MATCH (user:User)-[:PRIMARY_EMAIL]->(email:EmailAddress {email:$email}) @@ -19,7 +19,7 @@ export default async function createPasswordReset(options) { email: normalizedEmail, }, ) - return createPasswordResetTransactionResponse.records.map(record => { + return createPasswordResetTransactionResponse.records.map((record) => { const { email } = record.get('email').properties const { nonce } = record.get('passwordReset').properties const { name } = record.get('user').properties diff --git a/backend/src/schema/resolvers/helpers/existingEmailAddress.js b/backend/src/schema/resolvers/helpers/existingEmailAddress.js index 960b2066f..717d0d904 100644 --- a/backend/src/schema/resolvers/helpers/existingEmailAddress.js +++ b/backend/src/schema/resolvers/helpers/existingEmailAddress.js @@ -3,7 +3,7 @@ import { UserInputError } from 'apollo-server' export default async function alreadyExistingMail({ args, context }) { const session = context.driver.session() try { - const existingEmailAddressTxPromise = session.writeTransaction(async transaction => { + const existingEmailAddressTxPromise = session.writeTransaction(async (transaction) => { const existingEmailAddressTransactionResponse = await transaction.run( ` MATCH (email:EmailAddress {email: $email}) @@ -12,7 +12,7 @@ export default async function alreadyExistingMail({ args, context }) { `, { email: args.email }, ) - return existingEmailAddressTransactionResponse.records.map(record => { + return existingEmailAddressTransactionResponse.records.map((record) => { return { alreadyExistingEmail: record.get('email').properties, user: record.get('user') && record.get('user').properties, diff --git a/backend/src/schema/resolvers/helpers/filterForMutedUsers.js b/backend/src/schema/resolvers/helpers/filterForMutedUsers.js index 78f461c28..5094039ee 100644 --- a/backend/src/schema/resolvers/helpers/filterForMutedUsers.js +++ b/backend/src/schema/resolvers/helpers/filterForMutedUsers.js @@ -4,7 +4,7 @@ import { mergeWith, isArray } from 'lodash' export const filterForMutedUsers = async (params, context) => { if (!context.user) return params const [mutedUsers] = await Promise.all([getMutedUsers(context)]) - const mutedUsersIds = [...mutedUsers.map(user => user.id)] + const mutedUsersIds = [...mutedUsers.map((user) => user.id)] if (!mutedUsersIds.length) return params params.filter = mergeWith( diff --git a/backend/src/schema/resolvers/helpers/normalizeEmail.js b/backend/src/schema/resolvers/helpers/normalizeEmail.js index bdd12e991..bc13467c3 100644 --- a/backend/src/schema/resolvers/helpers/normalizeEmail.js +++ b/backend/src/schema/resolvers/helpers/normalizeEmail.js @@ -1,6 +1,6 @@ import { normalizeEmail } from 'validator' -export default email => +export default (email) => normalizeEmail(email, { // gmail_remove_dots: true, default gmail_remove_subaddress: false, diff --git a/backend/src/schema/resolvers/images/images.js b/backend/src/schema/resolvers/images/images.js index 51bd16d7d..18a3569b6 100644 --- a/backend/src/schema/resolvers/images/images.js +++ b/backend/src/schema/resolvers/images/images.js @@ -1,11 +1,14 @@ import path from 'path' import { v4 as uuid } from 'uuid' +import { S3 } from 'aws-sdk' import slug from 'slug' import { existsSync, unlinkSync, createWriteStream } from 'fs' -import { getDriver } from '../../../db/neo4j' import { UserInputError } from 'apollo-server' +import { getDriver } from '../../../db/neo4j' +import { s3Configs } from '../../../config' // const widths = [34, 160, 320, 640, 1024] +const { AWS_ENDPOINT: endpoint, AWS_REGION: region, AWS_BUCKET: Bucket, S3_CONFIGURED } = s3Configs export async function deleteImage(resource, relationshipType, opts = {}) { sanitizeRelationshipType(relationshipType) @@ -20,7 +23,7 @@ export async function deleteImage(resource, relationshipType, opts = {}) { `, { resource }, ) - const [image] = txResult.records.map(record => record.get('imageProps')) + const [image] = txResult.records.map((record) => record.get('imageProps')) // This behaviour differs from `mergeImage`. If you call `mergeImage` // with metadata for an image that does not exist, it's an indicator // of an error (so throw an error). If we bulk delete an image, it @@ -45,7 +48,7 @@ export async function mergeImage(resource, relationshipType, imageInput, opts = `, { resource }, ) - const [existingImage] = txResult.records.map(record => record.get('image')) + const [existingImage] = txResult.records.map((record) => record.get('image')) const { upload } = imageInput if (!(existingImage || upload)) throw new UserInputError('Cannot find image for given resource') if (existingImage && upload) deleteImageFile(existingImage, deleteCallback) @@ -63,14 +66,14 @@ export async function mergeImage(resource, relationshipType, imageInput, opts = `, { resource, image }, ) - const [mergedImage] = txResult.records.map(record => record.get('image')) + const [mergedImage] = txResult.records.map((record) => record.get('image')) return mergedImage } const wrapTransaction = async (wrappedCallback, args, opts) => { const session = getDriver().session() try { - const result = await session.writeTransaction(async transaction => { + const result = await session.writeTransaction(async (transaction) => { return wrappedCallback(...args, { ...opts, transaction }) }) return result @@ -79,26 +82,27 @@ const wrapTransaction = async (wrappedCallback, args, opts) => { } } -const deleteImageFile = (image, deleteCallback = localFileDelete) => { +const deleteImageFile = (image, deleteCallback) => { + if (!deleteCallback) { + deleteCallback = S3_CONFIGURED ? s3Delete : localFileDelete + } const { url } = image deleteCallback(url) return url } -const uploadImageFile = async (upload, uploadCallback = localFileUpload) => { +const uploadImageFile = async (upload, uploadCallback) => { if (!upload) return undefined + if (!uploadCallback) { + uploadCallback = S3_CONFIGURED ? s3Upload : localFileUpload + } const { createReadStream, filename, mimetype } = await upload const { name, ext } = path.parse(filename) const uniqueFilename = `${uuid()}-${slug(name)}${ext}` - - return uploadCallback({ - createReadStream, - destination: `/uploads/${uniqueFilename}`, - mimetype, - }) + return uploadCallback({ createReadStream, uniqueFilename, mimetype }) } -const sanitizeRelationshipType = relationshipType => { +const sanitizeRelationshipType = (relationshipType) => { // Cypher query language does not allow to parameterize relationship types // See: https://github.com/neo4j/neo4j/issues/340 if (!['HERO_IMAGE', 'AVATAR_IMAGE'].includes(relationshipType)) { @@ -106,7 +110,8 @@ const sanitizeRelationshipType = relationshipType => { } } -const localFileUpload = ({ createReadStream, destination }) => { +const localFileUpload = ({ createReadStream, uniqueFilename }) => { + const destination = `/uploads/${uniqueFilename}` return new Promise((resolve, reject) => createReadStream() .pipe(createWriteStream(`public${destination}`)) @@ -115,7 +120,34 @@ const localFileUpload = ({ createReadStream, destination }) => { ) } -const localFileDelete = async url => { +const s3Upload = async ({ createReadStream, uniqueFilename, mimetype }) => { + const s3 = new S3({ region, endpoint }) + const s3Location = `original/${uniqueFilename}` + + const params = { + Bucket, + Key: s3Location, + ACL: 'public-read', + ContentType: mimetype, + Body: createReadStream(), + } + const data = await s3.upload(params).promise() + const { Location } = data + return Location +} + +const localFileDelete = async (url) => { const location = `public${url}` if (existsSync(location)) unlinkSync(location) } + +const s3Delete = async (url) => { + const s3 = new S3({ region, endpoint }) + let { pathname } = new URL(url, 'http://example.org') // dummy domain to avoid invalid URL error + pathname = pathname.substring(1) // remove first character '/' + const params = { + Bucket, + Key: pathname, + } + await s3.deleteObject(params).promise() +} diff --git a/backend/src/schema/resolvers/images/images.spec.js b/backend/src/schema/resolvers/images/images.spec.js index 228394b01..42064621c 100644 --- a/backend/src/schema/resolvers/images/images.spec.js +++ b/backend/src/schema/resolvers/images/images.spec.js @@ -11,7 +11,7 @@ let deleteCallback beforeEach(async () => { await cleanDatabase() - uploadCallback = jest.fn(({ destination }) => destination) + uploadCallback = jest.fn(({ uniqueFilename }) => `/uploads/${uniqueFilename}`) deleteCallback = jest.fn() }) @@ -50,13 +50,13 @@ describe('deleteImage', () => { const session = driver.session() let someString try { - someString = await session.writeTransaction(async transaction => { + someString = await session.writeTransaction(async (transaction) => { await deleteImage(user, 'AVATAR_IMAGE', { deleteCallback, transaction, }) const txResult = await transaction.run('RETURN "Hello" as result') - const [result] = txResult.records.map(record => record.get('result')) + const [result] = txResult.records.map((record) => record.get('result')) return result }) } finally { @@ -66,11 +66,11 @@ describe('deleteImage', () => { await expect(someString).toEqual('Hello') }) - it('rolls back the transaction in case of errors', async done => { + it('rolls back the transaction in case of errors', async (done) => { await expect(neode.all('Image')).resolves.toHaveLength(1) const session = driver.session() try { - await session.writeTransaction(async transaction => { + await session.writeTransaction(async (transaction) => { await deleteImage(user, 'AVATAR_IMAGE', { deleteCallback, transaction, @@ -99,34 +99,34 @@ describe('mergeImage', () => { } }) - describe('on existing resource', () => { - beforeEach(async () => { - post = await Factory.build( - 'post', - { id: 'p99' }, - { - author: Factory.build('user', {}, { avatar: null }), - image: null, + describe('given image.upload', () => { + beforeEach(() => { + imageInput = { + ...imageInput, + upload: { + filename: 'image.jpg', + mimetype: 'image/jpeg', + encoding: '7bit', + createReadStream: () => ({ + pipe: () => ({ + on: (_, callback) => callback(), + }), + }), }, - ) - post = await post.toJson() + } }) - describe('given image.upload', () => { - beforeEach(() => { - imageInput = { - ...imageInput, - upload: { - filename: 'image.jpg', - mimetype: 'image/jpeg', - encoding: '7bit', - createReadStream: () => ({ - pipe: () => ({ - on: (_, callback) => callback(), - }), - }), + describe('on existing resource', () => { + beforeEach(async () => { + post = await Factory.build( + 'post', + { id: 'p99' }, + { + author: Factory.build('user', {}, { avatar: null }), + image: null, }, - } + ) + post = await post.toJson() }) it('returns new image', async () => { @@ -203,7 +203,7 @@ describe('mergeImage', () => { it('executes cypher statements within the transaction', async () => { const session = driver.session() try { - await session.writeTransaction(async transaction => { + await session.writeTransaction(async (transaction) => { const image = await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback, @@ -227,10 +227,10 @@ describe('mergeImage', () => { }) }) - it('rolls back the transaction in case of errors', async done => { + it('rolls back the transaction in case of errors', async (done) => { const session = driver.session() try { - await session.writeTransaction(async transaction => { + await session.writeTransaction(async (transaction) => { const image = await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback, @@ -330,7 +330,7 @@ describe('mergeImage', () => { }) it('updates metadata', async () => { - await mergeImage(post, 'HERO_IMAGE', imageInput) + await mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }) const images = await neode.all('Image') expect(images).toHaveLength(1) await expect(images.first().toJson()).resolves.toMatchObject({ diff --git a/backend/src/schema/resolvers/moderation.js b/backend/src/schema/resolvers/moderation.js index 07054d3a3..c261d187e 100644 --- a/backend/src/schema/resolvers/moderation.js +++ b/backend/src/schema/resolvers/moderation.js @@ -21,14 +21,14 @@ export default { WITH review, report, resource {.*, __typename: labels(resource)[0]} AS finalResource RETURN review {.*, report: properties(report), resource: properties(finalResource)} ` - const reviewWriteTxResultPromise = session.writeTransaction(async txc => { + const reviewWriteTxResultPromise = session.writeTransaction(async (txc) => { const reviewTransactionResponse = await txc.run(cypher, { params, moderatorId: moderator.id, dateTime: new Date().toISOString(), }) log(reviewTransactionResponse) - return reviewTransactionResponse.records.map(record => record.get('review')) + return reviewTransactionResponse.records.map((record) => record.get('review')) }) const [reviewed] = await reviewWriteTxResultPromise return reviewed || null diff --git a/backend/src/schema/resolvers/notifications.js b/backend/src/schema/resolvers/notifications.js index cf35fa8a1..3c01ddb97 100644 --- a/backend/src/schema/resolvers/notifications.js +++ b/backend/src/schema/resolvers/notifications.js @@ -42,7 +42,7 @@ export default { const offset = args.offset && typeof args.offset === 'number' ? `SKIP ${args.offset}` : '' const limit = args.first && typeof args.first === 'number' ? `LIMIT ${args.first}` : '' - const readTxResultPromise = session.readTransaction(async transaction => { + const readTxResultPromise = session.readTransaction(async (transaction) => { const notificationsTransactionResponse = await transaction.run( ` MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id}) @@ -59,7 +59,7 @@ export default { { id: currentUser.id }, ) log(notificationsTransactionResponse) - return notificationsTransactionResponse.records.map(record => record.get('notification')) + return notificationsTransactionResponse.records.map((record) => record.get('notification')) }) try { const notifications = await readTxResultPromise @@ -73,7 +73,7 @@ export default { markAsRead: async (parent, args, context, resolveInfo) => { const { user: currentUser } = context const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const markNotificationAsReadTransactionResponse = await transaction.run( ` MATCH (resource {id: $resourceId})-[notification:NOTIFIED {read: FALSE}]->(user:User {id:$id}) @@ -88,7 +88,7 @@ export default { { resourceId: args.id, id: currentUser.id }, ) log(markNotificationAsReadTransactionResponse) - return markNotificationAsReadTransactionResponse.records.map(record => + return markNotificationAsReadTransactionResponse.records.map((record) => record.get('notification'), ) }) @@ -101,7 +101,7 @@ export default { }, }, NOTIFIED: { - id: async parent => { + id: async (parent) => { // serialize an ID to help the client update the cache return `${parent.reason}/${parent.from.id}/${parent.to.id}` }, diff --git a/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.js index b3fc9f5c3..d1f49876b 100644 --- a/backend/src/schema/resolvers/passwordReset.js +++ b/backend/src/schema/resolvers/passwordReset.js @@ -14,7 +14,7 @@ export default { const encryptedNewPassword = await bcrypt.hashSync(newPassword, 10) const session = driver.session() try { - const passwordResetTxPromise = session.writeTransaction(async transaction => { + const passwordResetTxPromise = session.writeTransaction(async (transaction) => { const passwordResetTransactionResponse = await transaction.run( ` MATCH (passwordReset:PasswordReset {nonce: $nonce}) @@ -32,7 +32,9 @@ export default { encryptedNewPassword, }, ) - return passwordResetTransactionResponse.records.map(record => record.get('passwordReset')) + return passwordResetTransactionResponse.records.map((record) => + record.get('passwordReset'), + ) }) const [reset] = await passwordResetTxPromise return !!(reset && reset.properties.usedAt) diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js index b48498ee7..fd1395c57 100644 --- a/backend/src/schema/resolvers/passwordReset.spec.js +++ b/backend/src/schema/resolvers/passwordReset.spec.js @@ -16,7 +16,7 @@ const getAllPasswordResets = async () => { const passwordResetQuery = await neode.cypher( 'MATCH (passwordReset:PasswordReset) RETURN passwordReset', ) - const resets = passwordResetQuery.records.map(record => record.get('passwordReset')) + const resets = passwordResetQuery.records.map((record) => record.get('passwordReset')) return resets } diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index eb265e528..f209158fe 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -6,7 +6,7 @@ import { mergeImage, deleteImage } from './images/images' import Resolver from './helpers/Resolver' import { filterForMutedUsers } from './helpers/filterForMutedUsers' -const maintainPinnedPosts = params => { +const maintainPinnedPosts = (params) => { const pinnedPostFilter = { pinned: true } if (isEmpty(params.filter)) { params.filter = { OR: [pinnedPostFilter, {}] } @@ -34,7 +34,7 @@ export default { PostsEmotionsCountByEmotion: async (object, params, context, resolveInfo) => { const { postId, data } = params const session = context.driver.session() - const readTxResultPromise = session.readTransaction(async transaction => { + const readTxResultPromise = session.readTransaction(async (transaction) => { const emotionsCountTransactionResponse = await transaction.run( ` MATCH (post:Post {id: $postId})<-[emoted:EMOTED {emotion: $data.emotion}]-() @@ -43,7 +43,7 @@ export default { { postId, data }, ) return emotionsCountTransactionResponse.records.map( - record => record.get('emotionsCount').low, + (record) => record.get('emotionsCount').low, ) }) try { @@ -56,7 +56,7 @@ export default { PostsEmotionsByCurrentUser: async (object, params, context, resolveInfo) => { const { postId } = params const session = context.driver.session() - const readTxResultPromise = session.readTransaction(async transaction => { + const readTxResultPromise = session.readTransaction(async (transaction) => { const emotionsTransactionResponse = await transaction.run( ` MATCH (user:User {id: $userId})-[emoted:EMOTED]->(post:Post {id: $postId}) @@ -64,7 +64,7 @@ export default { `, { userId: context.user.id, postId }, ) - return emotionsTransactionResponse.records.map(record => record.get('emotion')) + return emotionsTransactionResponse.records.map((record) => record.get('emotion')) }) try { const [emotions] = await readTxResultPromise @@ -82,7 +82,7 @@ export default { delete params.image params.id = params.id || uuid() const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const createPostTransactionResponse = await transaction.run( ` CREATE (post:Post) @@ -100,7 +100,7 @@ export default { `, { userId: context.user.id, categoryIds, params }, ) - const [post] = createPostTransactionResponse.records.map(record => record.get('post')) + const [post] = createPostTransactionResponse.records.map((record) => record.get('post')) if (imageInput) { await mergeImage(post, 'HERO_IMAGE', imageInput, { transaction }) } @@ -137,7 +137,7 @@ export default { RETURN post, category ` - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run(cypherDeletePreviousRelations, { params }) }) @@ -152,12 +152,12 @@ export default { updatePostCypher += `RETURN post {.*}` const updatePostVariables = { categoryIds, params } try { - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const updatePostTransactionResponse = await transaction.run( updatePostCypher, updatePostVariables, ) - const [post] = updatePostTransactionResponse.records.map(record => record.get('post')) + const [post] = updatePostTransactionResponse.records.map((record) => record.get('post')) await mergeImage(post, 'HERO_IMAGE', imageInput, { transaction }) return post }) @@ -170,7 +170,7 @@ export default { DeletePost: async (object, args, context, resolveInfo) => { const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const deletePostTransactionResponse = await transaction.run( ` MATCH (post:Post {id: $postId}) @@ -184,7 +184,7 @@ export default { `, { postId: args.id }, ) - const [post] = deletePostTransactionResponse.records.map(record => record.get('post')) + const [post] = deletePostTransactionResponse.records.map((record) => record.get('post')) await deleteImage(post, 'HERO_IMAGE', { transaction }) return post }) @@ -199,7 +199,7 @@ export default { const { to, data } = params const { user } = context const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const addPostEmotionsTransactionResponse = await transaction.run( ` MATCH (userFrom:User {id: $user.id}), (postTo:Post {id: $to.id}) @@ -207,7 +207,7 @@ export default { RETURN userFrom, postTo, emotedRelation`, { user, to, data }, ) - return addPostEmotionsTransactionResponse.records.map(record => { + return addPostEmotionsTransactionResponse.records.map((record) => { return { from: { ...record.get('userFrom').properties }, to: { ...record.get('postTo').properties }, @@ -226,7 +226,7 @@ export default { const { to, data } = params const { id: from } = context.user const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const removePostEmotionsTransactionResponse = await transaction.run( ` MATCH (userFrom:User {id: $from})-[emotedRelation:EMOTED {emotion: $data.emotion}]->(postTo:Post {id: $to.id}) @@ -235,7 +235,7 @@ export default { `, { from, to, data }, ) - return removePostEmotionsTransactionResponse.records.map(record => { + return removePostEmotionsTransactionResponse.records.map((record) => { return { from: { ...record.get('userFrom').properties }, to: { ...record.get('postTo').properties }, @@ -255,7 +255,7 @@ export default { const { driver, user } = context const session = driver.session() const { id: userId } = user - let writeTxResultPromise = session.writeTransaction(async transaction => { + let writeTxResultPromise = session.writeTransaction(async (transaction) => { const deletePreviousRelationsResponse = await transaction.run( ` MATCH (:User)-[previousRelations:PINNED]->(post:Post) @@ -264,12 +264,14 @@ export default { RETURN post `, ) - return deletePreviousRelationsResponse.records.map(record => record.get('post').properties) + return deletePreviousRelationsResponse.records.map( + (record) => record.get('post').properties, + ) }) try { await writeTxResultPromise - writeTxResultPromise = session.writeTransaction(async transaction => { + writeTxResultPromise = session.writeTransaction(async (transaction) => { const pinPostTransactionResponse = await transaction.run( ` MATCH (user:User {id: $userId}) WHERE user.role = 'admin' @@ -280,7 +282,7 @@ export default { `, { userId, params }, ) - return pinPostTransactionResponse.records.map(record => ({ + return pinPostTransactionResponse.records.map((record) => ({ pinnedPost: record.get('post').properties, pinnedAt: record.get('pinnedAt'), })) @@ -299,7 +301,7 @@ export default { unpinPost: async (_parent, params, context, _resolveInfo) => { let unpinnedPost const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const unpinPostTransactionResponse = await transaction.run( ` MATCH (:User)-[previousRelations:PINNED]->(post:Post {id: $params.id}) @@ -309,7 +311,7 @@ export default { `, { params }, ) - return unpinPostTransactionResponse.records.map(record => record.get('post').properties) + return unpinPostTransactionResponse.records.map((record) => record.get('post').properties) }) try { ;[unpinnedPost] = await writeTxResultPromise @@ -351,7 +353,7 @@ export default { const { id } = parent const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const relatedContributionsTransactionResponse = await transaction.run( ` MATCH (p:Post {id: $id})-[:TAGGED|CATEGORIZED]->(categoryOrTag)<-[:TAGGED|CATEGORIZED]-(post:Post) @@ -362,7 +364,7 @@ export default { { id }, ) return relatedContributionsTransactionResponse.records.map( - record => record.get('post').properties, + (record) => record.get('post').properties, ) }) try { diff --git a/backend/src/schema/resolvers/registration.js b/backend/src/schema/resolvers/registration.js index 921570e5d..f1c43be21 100644 --- a/backend/src/schema/resolvers/registration.js +++ b/backend/src/schema/resolvers/registration.js @@ -37,7 +37,7 @@ export default { const { driver } = context const session = driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const createUserTransactionResponse = await transaction.run( ` MATCH(email:EmailAddress {nonce: $nonce, email: $email}) @@ -57,7 +57,7 @@ export default { `, { args, nonce, email }, ) - const [user] = createUserTransactionResponse.records.map(record => record.get('user')) + const [user] = createUserTransactionResponse.records.map((record) => record.get('user')) if (!user) throw new UserInputError('Invalid email or nonce') return user }) diff --git a/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.js index f7a2addc4..da8d794c5 100644 --- a/backend/src/schema/resolvers/reports.js +++ b/backend/src/schema/resolvers/reports.js @@ -6,7 +6,7 @@ export default { const { resourceId, reasonCategory, reasonDescription } = params const { driver, user } = context const session = driver.session() - const fileReportWriteTxResultPromise = session.writeTransaction(async transaction => { + const fileReportWriteTxResultPromise = session.writeTransaction(async (transaction) => { const fileReportTransactionResponse = await transaction.run( ` MATCH (submitter:User {id: $submitterId}) @@ -29,7 +29,7 @@ export default { }, ) log(fileReportTransactionResponse) - return fileReportTransactionResponse.records.map(record => record.get('filedReport')) + return fileReportTransactionResponse.records.map((record) => record.get('filedReport')) }) try { const [filedReport] = await fileReportWriteTxResultPromise @@ -81,7 +81,7 @@ export default { params.offset && typeof params.offset === 'number' ? `SKIP ${params.offset}` : '' const limit = params.first && typeof params.first === 'number' ? `LIMIT ${params.first}` : '' - const reportsReadTxPromise = session.readTransaction(async transaction => { + const reportsReadTxPromise = session.readTransaction(async (transaction) => { const reportsTransactionResponse = await transaction.run( // !!! this Cypher query returns multiple reports on the same resource! i will create an issue for refactoring (bug fixing) ` @@ -102,7 +102,7 @@ export default { `, ) log(reportsTransactionResponse) - return reportsTransactionResponse.records.map(record => record.get('report')) + return reportsTransactionResponse.records.map((record) => record.get('report')) }) try { const reports = await reportsReadTxPromise @@ -118,7 +118,7 @@ export default { const session = context.driver.session() const { id } = parent let filed - const readTxPromise = session.readTransaction(async transaction => { + const readTxPromise = session.readTransaction(async (transaction) => { const filedReportsTransactionResponse = await transaction.run( ` MATCH (submitter:User)-[filed:FILED]->(report:Report {id: $id}) @@ -127,14 +127,14 @@ export default { { id }, ) log(filedReportsTransactionResponse) - return filedReportsTransactionResponse.records.map(record => ({ + return filedReportsTransactionResponse.records.map((record) => ({ submitter: record.get('submitter').properties, filed: record.get('filed').properties, })) }) try { const filedReports = await readTxPromise - filed = filedReports.map(reportedRecord => { + filed = filedReports.map((reportedRecord) => { const { submitter, filed } = reportedRecord const relationshipWithNestedAttributes = { ...filed, @@ -152,7 +152,7 @@ export default { const session = context.driver.session() const { id } = parent let reviewed - const readTxPromise = session.readTransaction(async transaction => { + const readTxPromise = session.readTransaction(async (transaction) => { const reviewedReportsTransactionResponse = await transaction.run( ` MATCH (resource)<-[:BELONGS_TO]-(report:Report {id: $id})<-[review:REVIEWED]-(moderator:User) @@ -162,14 +162,14 @@ export default { { id }, ) log(reviewedReportsTransactionResponse) - return reviewedReportsTransactionResponse.records.map(record => ({ + return reviewedReportsTransactionResponse.records.map((record) => ({ review: record.get('review').properties, moderator: record.get('moderator').properties, })) }) try { const reviewedReports = await readTxPromise - reviewed = reviewedReports.map(reportedRecord => { + reviewed = reviewedReports.map((reportedRecord) => { const { review, moderator } = reportedRecord const relationshipWithNestedAttributes = { ...review, diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js index 5e1156f0c..2ecccfc23 100644 --- a/backend/src/schema/resolvers/reports.spec.js +++ b/backend/src/schema/resolvers/reports.spec.js @@ -246,7 +246,7 @@ describe('file a report on a resource', () => { }) expect(reportsCypherQueryResponse.records).toHaveLength(1) const [reportProperties] = reportsCypherQueryResponse.records.map( - record => record.get('report').properties, + (record) => record.get('report').properties, ) expect(reportProperties).toMatchObject({ rule: 'latestReviewUpdatedAtRules' }) }) @@ -264,7 +264,7 @@ describe('file a report on a resource', () => { }) expect(reportsCypherQueryResponse.records).toHaveLength(1) const [reportProperties] = reportsCypherQueryResponse.records.map( - record => record.get('report').properties, + (record) => record.get('report').properties, ) expect(reportProperties).toMatchObject({ disable: false }) }) @@ -297,7 +297,7 @@ describe('file a report on a resource', () => { }) expect(reportsCypherQueryResponse.records).toHaveLength(1) const [reportProperties] = reportsCypherQueryResponse.records.map( - record => record.get('report').properties, + (record) => record.get('report').properties, ) expect(reportProperties).toMatchObject({ disable: true }) }) diff --git a/backend/src/schema/resolvers/rewards.js b/backend/src/schema/resolvers/rewards.js index 311cfd2e6..c271ca8f8 100644 --- a/backend/src/schema/resolvers/rewards.js +++ b/backend/src/schema/resolvers/rewards.js @@ -24,7 +24,7 @@ export default { const { user } = await getUserAndBadge(params) const session = context.driver.session() try { - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run( ` MATCH (badge:Badge {id: $badgeKey})-[reward:REWARDED]->(rewardedUser:User {id: $userId}) diff --git a/backend/src/schema/resolvers/searches.js b/backend/src/schema/resolvers/searches.js index 3471c783b..58fa63f8d 100644 --- a/backend/src/schema/resolvers/searches.js +++ b/backend/src/schema/resolvers/searches.js @@ -54,7 +54,7 @@ export default { const myQuery = queryString(query) const session = context.driver.session() - const searchResultPromise = session.readTransaction(async transaction => { + const searchResultPromise = session.readTransaction(async (transaction) => { const postTransactionResponse = transaction.run(postCypher, { query: myQuery, limit, @@ -81,7 +81,7 @@ export default { log(postResults) log(userResults) log(tagResults) - return [...postResults.records, ...userResults.records, ...tagResults.records].map(r => + return [...postResults.records, ...userResults.records, ...tagResults.records].map((r) => r.get('resource'), ) } finally { diff --git a/backend/src/schema/resolvers/searches.spec.js b/backend/src/schema/resolvers/searches.spec.js index 081d71e55..3d7bd039d 100644 --- a/backend/src/schema/resolvers/searches.spec.js +++ b/backend/src/schema/resolvers/searches.spec.js @@ -104,6 +104,7 @@ describe('resolvers/searches', () => { }, ], }, + errors: undefined, }) }) }) @@ -122,6 +123,7 @@ describe('resolvers/searches', () => { }, ], }, + errors: undefined, }) }) }) @@ -202,6 +204,7 @@ und hinter tausend Stäben keine Welt.`, }, ]), }, + errors: undefined, }) }) }) @@ -222,6 +225,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -240,6 +244,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -262,6 +267,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -282,6 +288,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -302,6 +309,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -331,6 +339,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) @@ -358,6 +367,7 @@ und hinter tausend Stäben keine Welt.`, }, ]), }, + errors: undefined, }) }) }) @@ -400,6 +410,7 @@ und hinter tausend Stäben keine Welt.`, }, ]), }, + errors: undefined, }) }) }) @@ -438,6 +449,7 @@ und hinter tausend Stäben keine Welt.`, }, ]), }, + errors: undefined, }) }) }) @@ -460,6 +472,7 @@ und hinter tausend Stäben keine Welt.`, }, ], }, + errors: undefined, }) }) }) diff --git a/backend/src/schema/resolvers/searches/queryString.js b/backend/src/schema/resolvers/searches/queryString.js index c3500188c..064f17f48 100644 --- a/backend/src/schema/resolvers/searches/queryString.js +++ b/backend/src/schema/resolvers/searches/queryString.js @@ -26,15 +26,15 @@ const matchSomeWordsExactly = (str, boost = 2) => { if (!str.includes(' ')) return '' return str .split(' ') - .map(s => `"${s}"^${boost}`) + .map((s) => `"${s}"^${boost}`) .join(' ') } -const matchBeginningOfWords = str => { +const matchBeginningOfWords = (str) => { return str .split(' ') - .filter(s => s.length > 3) - .map(s => s + '*') + .filter((s) => s.length > 3) + .map((s) => s + '*') .join(' ') } diff --git a/backend/src/schema/resolvers/shout.js b/backend/src/schema/resolvers/shout.js index 70ebdf7ae..8c330cd67 100644 --- a/backend/src/schema/resolvers/shout.js +++ b/backend/src/schema/resolvers/shout.js @@ -7,7 +7,7 @@ export default { const session = context.driver.session() try { - const shoutWriteTxResultPromise = session.writeTransaction(async transaction => { + const shoutWriteTxResultPromise = session.writeTransaction(async (transaction) => { const shoutTransactionResponse = await transaction.run( ` MATCH (node {id: $id})<-[:WROTE]-(userWritten:User), (user:User {id: $userId}) @@ -22,7 +22,7 @@ export default { }, ) log(shoutTransactionResponse) - return shoutTransactionResponse.records.map(record => record.get('isShouted')) + return shoutTransactionResponse.records.map((record) => record.get('isShouted')) }) const [isShouted] = await shoutWriteTxResultPromise return isShouted @@ -35,7 +35,7 @@ export default { const { id, type } = params const session = context.driver.session() try { - const unshoutWriteTxResultPromise = session.writeTransaction(async transaction => { + const unshoutWriteTxResultPromise = session.writeTransaction(async (transaction) => { const unshoutTransactionResponse = await transaction.run( ` MATCH (user:User {id: $userId})-[relation:SHOUTED]->(node {id: $id}) @@ -50,7 +50,7 @@ export default { }, ) log(unshoutTransactionResponse) - return unshoutTransactionResponse.records.map(record => record.get('isShouted')) + return unshoutTransactionResponse.records.map((record) => record.get('isShouted')) }) const [isShouted] = await unshoutWriteTxResultPromise return isShouted diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index f5ec8f5fd..574907180 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -132,7 +132,7 @@ describe('shout and unshout posts', () => { }, ) const relationshipProperties = relation.records.map( - record => record.get('relationship').properties.createdAt, + (record) => record.get('relationship').properties.createdAt, ) expect(relationshipProperties[0]).toEqual(expect.any(String)) }) diff --git a/backend/src/schema/resolvers/statistics.js b/backend/src/schema/resolvers/statistics.js index 7ca9239f3..d9b7c153e 100644 --- a/backend/src/schema/resolvers/statistics.js +++ b/backend/src/schema/resolvers/statistics.js @@ -15,7 +15,7 @@ export default { countFollows: 'FOLLOWS', countShouts: 'SHOUTED', } - const statisticsReadTxResultPromise = session.readTransaction(async transaction => { + const statisticsReadTxResultPromise = session.readTransaction(async (transaction) => { const statisticsTransactionResponse = await transaction.run( ` CALL apoc.meta.stats() YIELD labels, relTypesCount @@ -23,7 +23,7 @@ export default { `, ) log(statisticsTransactionResponse) - return statisticsTransactionResponse.records.map(record => { + return statisticsTransactionResponse.records.map((record) => { return { ...record.get('labels'), ...record.get('relTypesCount'), @@ -31,7 +31,7 @@ export default { }) }) const [statistics] = await statisticsReadTxResultPromise - Object.keys(mapping).forEach(key => { + Object.keys(mapping).forEach((key) => { const stat = statistics[mapping[key]] counts[key] = stat ? stat.toNumber() : 0 }) diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js index dd081321d..beb2cddb3 100644 --- a/backend/src/schema/resolvers/user_management.js +++ b/backend/src/schema/resolvers/user_management.js @@ -16,7 +16,7 @@ export default { const { user, driver } = context if (!user) return null const session = driver.session() - const currentUserTransactionPromise = session.readTransaction(async transaction => { + const currentUserTransactionPromise = session.readTransaction(async (transaction) => { const result = await transaction.run( ` MATCH (user:User {id: $id}) @@ -26,7 +26,7 @@ export default { { id: user.id }, ) log(result) - return result.records.map(record => record.get('user')) + return result.records.map((record) => record.get('user')) }) try { const [currentUser] = await currentUserTransactionPromise @@ -44,7 +44,7 @@ export default { email = normalizeEmail(email) const session = driver.session() try { - const loginReadTxResultPromise = session.readTransaction(async transaction => { + const loginReadTxResultPromise = session.readTransaction(async (transaction) => { const loginTransactionResponse = await transaction.run( ` MATCH (user:User {deleted: false})-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $userEmail}) @@ -53,7 +53,7 @@ export default { { userEmail: email }, ) log(loginTransactionResponse) - return loginTransactionResponse.records.map(record => record.get('user')) + return loginTransactionResponse.records.map((record) => record.get('user')) }) const [currentUser] = await loginReadTxResultPromise if ( diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js index 399e2ace3..b434ea628 100644 --- a/backend/src/schema/resolvers/user_management.spec.js +++ b/backend/src/schema/resolvers/user_management.spec.js @@ -10,7 +10,7 @@ import { getNeode } from '../../db/neo4j' const neode = getNeode() let query, mutate, variables, req, user -const disable = async id => { +const disable = async (id) => { const moderator = await Factory.build('user', { id: 'u2', role: 'moderator' }) const user = await neode.find('User', id) const reportAgainstUser = await Factory.build('report') @@ -56,7 +56,7 @@ describe('isLoggedIn', () => { isLoggedIn } ` - const respondsWith = async expected => { + const respondsWith = async (expected) => { await expect(query({ query: isLoggedInQuery })).resolves.toMatchObject(expected) } @@ -115,7 +115,7 @@ describe('currentUser', () => { } ` - const respondsWith = async expected => { + const respondsWith = async (expected) => { await expect(query({ query: currentUserQuery, variables })).resolves.toMatchObject(expected) } @@ -176,7 +176,7 @@ describe('login', () => { } ` - const respondsWith = async expected => { + const respondsWith = async (expected) => { await expect(mutate({ mutation: loginMutation, variables })).resolves.toMatchObject(expected) } @@ -193,7 +193,7 @@ describe('login', () => { describe('ask for a `token`', () => { describe('with a valid email/password combination', () => { - it('responds with a JWT bearer token', async done => { + it('responds with a JWT bearer token', async (done) => { const { data: { login: token }, } = await mutate({ mutation: loginMutation, variables }) @@ -292,7 +292,7 @@ describe('change password', () => { } ` - const respondsWith = async expected => { + const respondsWith = async (expected) => { await expect(mutate({ mutation: changePasswordMutation, variables })).resolves.toMatchObject( expected, ) diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index b2f752143..e276968e5 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -8,7 +8,7 @@ import createOrUpdateLocations from './users/location' const neode = getNeode() -export const getMutedUsers = async context => { +export const getMutedUsers = async (context) => { const { neode } = context const userModel = neode.model('User') let mutedUsers = neode @@ -19,11 +19,11 @@ export const getMutedUsers = async context => { .to('muted', userModel) .return('muted') mutedUsers = await mutedUsers.execute() - mutedUsers = mutedUsers.records.map(r => r.get('muted').properties) + mutedUsers = mutedUsers.records.map((r) => r.get('muted').properties) return mutedUsers } -export const getBlockedUsers = async context => { +export const getBlockedUsers = async (context) => { const { neode } = context const userModel = neode.model('User') let blockedUsers = neode @@ -34,7 +34,7 @@ export const getBlockedUsers = async context => { .to('blocked', userModel) .return('blocked') blockedUsers = await blockedUsers.execute() - blockedUsers = blockedUsers.records.map(r => r.get('blocked').properties) + blockedUsers = blockedUsers.records.map((r) => r.get('blocked').properties) return blockedUsers } @@ -60,7 +60,7 @@ export default { let session try { session = context.driver.session() - const readTxResult = await session.readTransaction(txc => { + const readTxResult = await session.readTransaction((txc) => { const result = txc.run( ` MATCH (user:User)-[:PRIMARY_EMAIL]->(e:EmailAddress {email: $args.email}) @@ -69,7 +69,7 @@ export default { ) return result }) - return readTxResult.records.map(r => r.get('user').properties) + return readTxResult.records.map((r) => r.get('user').properties) } finally { session.close() } @@ -151,7 +151,7 @@ export default { } const session = context.driver.session() - const writeTxResultPromise = session.writeTransaction(async transaction => { + const writeTxResultPromise = session.writeTransaction(async (transaction) => { const updateUserTransactionResponse = await transaction.run( ` MATCH (user:User {id: $params.id}) @@ -161,7 +161,7 @@ export default { `, { params }, ) - const [user] = updateUserTransactionResponse.records.map(record => record.get('user')) + const [user] = updateUserTransactionResponse.records.map((record) => record.get('user')) if (avatarInput) { await mergeImage(user, 'AVATAR_IMAGE', avatarInput, { transaction }) } @@ -181,10 +181,10 @@ export default { const { resource, id: userId } = params const session = context.driver.session() - const deleteUserTxResultPromise = session.writeTransaction(async transaction => { + const deleteUserTxResultPromise = session.writeTransaction(async (transaction) => { if (resource && resource.length) { await Promise.all( - resource.map(async node => { + resource.map(async (node) => { const txResult = await transaction.run( ` MATCH (resource:${node})<-[:WROTE]-(author:User {id: $userId}) @@ -204,8 +204,8 @@ export default { ) return Promise.all( txResult.records - .map(record => record.get('resource')) - .map(resource => deleteImage(resource, 'HERO_IMAGE', { transaction })), + .map((record) => record.get('resource')) + .map((resource) => deleteImage(resource, 'HERO_IMAGE', { transaction })), ) }), ) @@ -233,7 +233,7 @@ export default { { userId }, ) log(deleteUserTransactionResponse) - const [user] = deleteUserTransactionResponse.records.map(record => record.get('user')) + const [user] = deleteUserTransactionResponse.records.map((record) => record.get('user')) await deleteImage(user, 'AVATAR_IMAGE', { transaction }) return user }) @@ -251,7 +251,7 @@ export default { const { id } = parent const statement = `MATCH(u:User {id: {id}})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` const result = await neode.cypher(statement, { id }) - const [{ email }] = result.records.map(r => r.get('e').properties) + const [{ email }] = result.records.map((r) => r.get('e').properties) return email }, ...Resolver('User', { diff --git a/backend/src/schema/resolvers/users/location.js b/backend/src/schema/resolvers/users/location.js index cc00d9e0a..b58d8d1aa 100644 --- a/backend/src/schema/resolvers/users/location.js +++ b/backend/src/schema/resolvers/users/location.js @@ -7,9 +7,9 @@ import CONFIG from '../../../config' const debug = Debug('human-connection:location') -const fetch = url => { +const fetch = (url) => { return new Promise((resolve, reject) => { - request(url, function(error, response, body) { + request(url, function (error, response, body) { if (error) { reject(error) } else { @@ -57,7 +57,7 @@ const createLocation = async (session, mapboxData) => { } mutation += ' RETURN l.id' - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run(mutation, data) }) } @@ -82,7 +82,7 @@ const createOrUpdateLocations = async (userId, locationName, session) => { let data - res.features.forEach(item => { + res.features.forEach((item) => { if (item.matching_place_name === locationName) { data = item } @@ -103,9 +103,9 @@ const createOrUpdateLocations = async (userId, locationName, session) => { let parent = data if (data.context) { - await asyncForEach(data.context, async ctx => { + await asyncForEach(data.context, async (ctx) => { await createLocation(session, ctx) - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run( ` MATCH (parent:Location {id: $parentId}), (child:Location {id: $childId}) @@ -122,7 +122,7 @@ const createOrUpdateLocations = async (userId, locationName, session) => { }) } // delete all current locations from user and add new location - await session.writeTransaction(transaction => { + await session.writeTransaction((transaction) => { return transaction.run( ` MATCH (user:User {id: $userId})-[relationship:IS_IN]->(location:Location) diff --git a/backend/src/schema/resolvers/users/location.spec.js b/backend/src/schema/resolvers/users/location.spec.js index 617951f01..59442a9ca 100644 --- a/backend/src/schema/resolvers/users/location.spec.js +++ b/backend/src/schema/resolvers/users/location.spec.js @@ -107,7 +107,7 @@ describe('userMiddleware', () => { `MATCH (city:Location)-[:IS_IN]->(state:Location)-[:IS_IN]->(country:Location) return city {.*}, state {.*}, country {.*}`, ) expect( - locations.records.map(record => { + locations.records.map((record) => { return { city: record.get('city'), state: record.get('state'), diff --git a/backend/src/schema/resolvers/users/mutedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.js index cdc7c81b3..345b435f5 100644 --- a/backend/src/schema/resolvers/users/mutedUsers.spec.js +++ b/backend/src/schema/resolvers/users/mutedUsers.spec.js @@ -90,7 +90,7 @@ describe('muteUser', () => { beforeEach(() => { currentUser = undefined - muteAction = variables => { + muteAction = (variables) => { const { mutate } = createTestClient(server) const muteUserMutation = gql` mutation($id: ID!) { @@ -307,7 +307,7 @@ describe('unmuteUser', () => { beforeEach(() => { currentUser = undefined - unmuteAction = variables => { + unmuteAction = (variables) => { const { mutate } = createTestClient(server) const unmuteUserMutation = gql` mutation($id: ID!) { diff --git a/backend/src/server.js b/backend/src/server.js index 4df73559d..5a71150f0 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -20,7 +20,7 @@ const options = { host: REDIS_DOMAIN, port: REDIS_PORT, password: REDIS_PASSWORD, - retryStrategy: times => { + retryStrategy: (times) => { return Math.min(times * 50, 2000) }, } @@ -36,7 +36,7 @@ export const pubsub = prodPubsub || devPubsub const driver = getDriver() const neode = getNeode() -const getContext = async req => { +const getContext = async (req) => { const user = await decode(driver, req.headers.authorization) return { driver, @@ -48,7 +48,7 @@ const getContext = async req => { }, } } -export const context = async options => { +export const context = async (options) => { const { connection, req } = options if (connection) { return connection.context @@ -57,7 +57,7 @@ export const context = async options => { } } -const createServer = options => { +const createServer = (options) => { const defaults = { context, schema: middleware(schema), @@ -68,9 +68,9 @@ const createServer = options => { }, debug: !!CONFIG.DEBUG, tracing: !!CONFIG.DEBUG, - formatError: error => { + formatError: (error) => { if (error.message === 'ERROR_VALIDATION') { - return new Error(error.originalError.details.map(d => d.message)) + return new Error(error.originalError.details.map((d) => d.message)) } return error }, diff --git a/backend/yarn.lock b/backend/yarn.lock index 726c5ee55..d53c6b169 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -56,42 +56,43 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.6.tgz#7eeaa0dfa17e50c7d9c0832515eee09b56f04e35" - integrity sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q== +"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" + integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== dependencies: - browserslist "^4.8.5" + browserslist "^4.9.1" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@~7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" - integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== +"@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@~7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" + integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.7" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.7" + "@babel/generator" "^7.9.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.9.0" + "@babel/parser" "^7.9.0" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.7" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" - json5 "^2.1.0" + json5 "^2.1.2" lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.8.6", "@babel/generator@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.7.tgz#870b3cf7984f5297998152af625c4f3e341400f7" - integrity sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew== +"@babel/generator@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" + integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== dependencies: - "@babel/types" "^7.8.7" + "@babel/types" "^7.9.0" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -111,15 +112,6 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-call-delegate@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz#28a279c2e6c622a6233da548127f980751324cab" - integrity sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ== - dependencies: - "@babel/helper-hoist-variables" "^7.8.3" - "@babel/traverse" "^7.8.3" - "@babel/types" "^7.8.7" - "@babel/helper-compilation-targets@^7.8.7": version "7.8.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" @@ -139,6 +131,15 @@ "@babel/helper-regex" "^7.8.3" regexpu-core "^4.6.0" +"@babel/helper-create-regexp-features-plugin@^7.8.8": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087" + integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-regex" "^7.8.3" + regexpu-core "^4.7.0" + "@babel/helper-define-map@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" @@ -165,6 +166,15 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -193,16 +203,17 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-module-transforms@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" - integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== dependencies: "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" "@babel/helper-simple-access" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.8.3": @@ -270,6 +281,11 @@ dependencies: "@babel/types" "^7.8.3" +"@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" @@ -280,14 +296,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helpers@^7.9.0": + version "7.9.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" + integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/traverse" "^7.9.0" + "@babel/types" "^7.9.0" "@babel/highlight@^7.8.3": version "7.8.3" @@ -312,10 +328,10 @@ resolve "^1.13.1" v8flags "^3.1.1" -"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.7.tgz#7b8facf95d25fef9534aad51c4ffecde1a61e26a" - integrity sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A== +"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" + integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -350,13 +366,22 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-object-rest-spread@^7.8.3": +"@babel/plugin-proposal-numeric-separator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" - integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8" + integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz#3fd65911306d8746014ec0d0cf78f0e39a149116" + integrity sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" @@ -366,10 +391,10 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== +"@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" + integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -382,12 +407,12 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-throw-expressions" "^7.8.3" -"@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" - integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== +"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d" + integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-create-regexp-features-plugin" "^7.8.8" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-async-generators@^7.8.0": @@ -397,13 +422,27 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-bigint@^7.0.0": +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.0.0", "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" + integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.0.tgz#3a6c1cd36af923db602df83c5aa72e08bb14353a" @@ -418,6 +457,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" + integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.0.tgz#5d8f24ecffa4ae74164e53264953c5ea8ba6d149" @@ -425,6 +478,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" + integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz#9b37d580d459682364d8602494c69145b394fd4c" @@ -432,6 +499,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.0.tgz#180c7bdd6b7fd81cc6d18269de12d5ddd60cabce" @@ -439,6 +513,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-optional-chaining@^7.8.0": version "7.8.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.0.tgz#c40f4d4d6a4f5e71d2bfd949b0a7f1e1e6792fe0" @@ -446,6 +527,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-throw-expressions@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.8.3.tgz#c763bcf26d202ddb65f1299a29d63aad312adb54" @@ -491,14 +579,14 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz#77534447a477cbe5995ae4aee3e39fbc8090c46d" - integrity sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg== +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" @@ -512,14 +600,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" - integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.8.3": +"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== @@ -542,10 +630,10 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-for-of@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz#a051bd1b402c61af97a27ff51b468321c7c2a085" - integrity sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw== +"@babel/plugin-transform-for-of@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e" + integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -571,41 +659,41 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" - integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== +"@babel/plugin-transform-modules-amd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" + integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" - integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== +"@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" + integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" - integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== +"@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" + integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== dependencies: "@babel/helper-hoist-variables" "^7.8.3" - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" - integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== +"@babel/plugin-transform-modules-umd@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697" + integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ== dependencies: - "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": @@ -630,12 +718,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.7.tgz#66fa2f1de4129b4e0447509223ac71bda4955395" - integrity sha512-brYWaEPTRimOctz2NDA3jnBbDi7SVN2T4wYuu0aqSzxC3nozFZngGaw29CJ9ZPweB7k+iFmZuoG3IVPIcXmD2g== +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== dependencies: - "@babel/helper-call-delegate" "^7.8.7" "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -705,12 +792,12 @@ "@babel/helper-create-regexp-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/preset-env@~7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.7.tgz#1fc7d89c7f75d2d70c2b6768de6c2e049b3cb9db" - integrity sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw== +"@babel/preset-env@~7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.5.tgz#8ddc76039bc45b774b19e2fc548f6807d8a8919f" + integrity sha512-eWGYeADTlPJH+wq1F0wNfPbVS1w1wtmMJiYk55Td5Yu28AsdR9AsC97sZ0Qq8fHqQuslVSIYSGJMcblr345GfQ== dependencies: - "@babel/compat-data" "^7.8.6" + "@babel/compat-data" "^7.9.0" "@babel/helper-compilation-targets" "^7.8.7" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -718,14 +805,16 @@ "@babel/plugin-proposal-dynamic-import" "^7.8.3" "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-numeric-separator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-json-strings" "^7.8.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.8.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" @@ -734,24 +823,24 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.8.6" + "@babel/plugin-transform-classes" "^7.9.5" "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" - "@babel/plugin-transform-for-of" "^7.8.6" + "@babel/plugin-transform-for-of" "^7.9.0" "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.8.3" - "@babel/plugin-transform-modules-commonjs" "^7.8.3" - "@babel/plugin-transform-modules-systemjs" "^7.8.3" - "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.9.0" + "@babel/plugin-transform-modules-commonjs" "^7.9.0" + "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-transform-property-literals" "^7.8.3" "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" @@ -761,17 +850,29 @@ "@babel/plugin-transform-template-literals" "^7.8.3" "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" - "@babel/types" "^7.8.7" - browserslist "^4.8.5" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.9.5" + browserslist "^4.9.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" semver "^5.5.0" -"@babel/register@^7.8.3", "@babel/register@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.8.6.tgz#a1066aa6168a73a70c35ef28cc5865ccc087ea69" - integrity sha512-7IDO93fuRsbyml7bAafBQb3RcBGlCpU4hh5wADA2LJEEcYk92WkwFZ0pHyIi2fb5Auoz1714abETdZKCOxN0CQ== +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/register@^7.8.3", "@babel/register@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.9.0.tgz#02464ede57548bddbb5e9f705d263b7c3f43d48b" + integrity sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q== dependencies: find-cache-dir "^2.0.0" lodash "^4.17.13" @@ -811,27 +912,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" - integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" + integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" + "@babel/generator" "^7.9.0" "@babel/helper-function-name" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/parser" "^7.9.0" + "@babel/types" "^7.9.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" - integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" + integrity sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg== dependencies: - esutils "^2.0.2" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -848,32 +949,33 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@graphql-toolkit/common@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.9.0.tgz#24d1744fa0d6b9331e8032097fcebb74390bad92" - integrity sha512-bLuyt4yV/XIHUS+gP4aF5xjnb5M2K+uuB35Hojw0er+tkNhWiOuWQzRMWPovds/4WN2C9PuknQby/+ntgBOm/g== +"@graphql-toolkit/common@0.9.12": + version "0.9.12" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.9.12.tgz#a3bf91d00130100cfa0a72be718b16cc1011ab45" + integrity sha512-NjBVxeM1GB0bldiBm4UQoxKtbu/hjRfcqDEt1JPia+uXgFde3qTxtF5IZkworRFNCp+8KPSVrwcreQHSfFW63w== dependencies: - "@kamilkisiela/graphql-tools" "4.0.6" aggregate-error "3.0.1" + camel-case "4.1.1" + graphql-tools-fork "9.0.1" lodash "4.17.15" -"@graphql-toolkit/file-loading@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/file-loading/-/file-loading-0.9.0.tgz#745cfe22adb0d710d09f43bdd67a2d9b54e0257a" - integrity sha512-Vs7n8VsZm1Oyw/1kKy/Y7fE8CznFA4SK4SEnWll9gpCmVE2vbATUYUlqSqm/W2npDdYB3FODEzhr5HIsQrjg6g== +"@graphql-toolkit/file-loading@0.9.12": + version "0.9.12" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/file-loading/-/file-loading-0.9.12.tgz#f7d5d7e042df59c4e6c8fe3417c67dd1cddf9043" + integrity sha512-xEmKkbWI5FXQARTN3dbPzshwcmduOJUvx1QGsfcuryVDdQJZynUEaPF7IxYaFpvQF7vwxGIRdff/jC/a5ypDrA== dependencies: globby "11.0.0" unixify "1.0.0" -"@graphql-toolkit/schema-merging@0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.9.0.tgz#f4fb380e6be57e0235c25a77fc0aec842414c27e" - integrity sha512-vrzkqkFXxZ4dXQrHeNGDDWONbOAVDeJmGPwK0cRu2aVszftvkYVJXBrmkMYzZJHwk+tGVkNywf1r00GR6prpOw== +"@graphql-toolkit/schema-merging@0.9.12": + version "0.9.12" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.9.12.tgz#f058a7d256a4ed0e61e9874f90ae03326b81668e" + integrity sha512-ciqxLeMw7KPbJcq/xgnPbGyJGRO6bO1zQcdWCUSssyw8VDRHj5PFqEOAzT88eZQkEtg3qLN/wQEypeyFyNTHzw== dependencies: - "@graphql-toolkit/common" "0.9.0" - "@kamilkisiela/graphql-tools" "4.0.6" + "@graphql-toolkit/common" "0.9.12" deepmerge "4.2.2" - tslib "1.10.0" + graphql-tools-fork "9.0.1" + tslib "1.11.1" "@hapi/address@2.x.x": version "2.1.2" @@ -962,81 +1064,80 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.1.0.tgz#1fc765d44a1e11aec5029c08e798246bd37075ab" - integrity sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA== +"@jest/console@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.3.0.tgz#33b56b81238427bf3ebe3f7b3378d2f79cdbd409" + integrity sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ== dependencies: - "@jest/source-map" "^25.1.0" + "@jest/source-map" "^25.2.6" chalk "^3.0.0" - jest-util "^25.1.0" + jest-util "^25.3.0" slash "^3.0.0" -"@jest/core@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.1.0.tgz#3d4634fc3348bb2d7532915d67781cdac0869e47" - integrity sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig== +"@jest/core@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.3.0.tgz#80f97a7a8b59dde741a24f30871cc26d0197d426" + integrity sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw== dependencies: - "@jest/console" "^25.1.0" - "@jest/reporters" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/transform" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/console" "^25.3.0" + "@jest/reporters" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" ansi-escapes "^4.2.1" chalk "^3.0.0" exit "^0.1.2" graceful-fs "^4.2.3" - jest-changed-files "^25.1.0" - jest-config "^25.1.0" - jest-haste-map "^25.1.0" - jest-message-util "^25.1.0" - jest-regex-util "^25.1.0" - jest-resolve "^25.1.0" - jest-resolve-dependencies "^25.1.0" - jest-runner "^25.1.0" - jest-runtime "^25.1.0" - jest-snapshot "^25.1.0" - jest-util "^25.1.0" - jest-validate "^25.1.0" - jest-watcher "^25.1.0" + jest-changed-files "^25.3.0" + jest-config "^25.3.0" + jest-haste-map "^25.3.0" + jest-message-util "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-resolve-dependencies "^25.3.0" + jest-runner "^25.3.0" + jest-runtime "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" + jest-watcher "^25.3.0" micromatch "^4.0.2" p-each-series "^2.1.0" - realpath-native "^1.1.0" + realpath-native "^2.0.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.1.0.tgz#4a97f64770c9d075f5d2b662b5169207f0a3f787" - integrity sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg== +"@jest/environment@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.3.0.tgz#587f28ddb4b0dfe97404d3d4a4c9dbfa0245fb2e" + integrity sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g== dependencies: - "@jest/fake-timers" "^25.1.0" - "@jest/types" "^25.1.0" - jest-mock "^25.1.0" + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" -"@jest/fake-timers@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.1.0.tgz#a1e0eff51ffdbb13ee81f35b52e0c1c11a350ce8" - integrity sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ== +"@jest/fake-timers@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.3.0.tgz#995aad36d5c8984165ca5db12e740ab8dbf7042a" + integrity sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ== dependencies: - "@jest/types" "^25.1.0" - jest-message-util "^25.1.0" - jest-mock "^25.1.0" - jest-util "^25.1.0" + "@jest/types" "^25.3.0" + jest-message-util "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" lolex "^5.0.0" -"@jest/reporters@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.1.0.tgz#9178ecf136c48f125674ac328f82ddea46e482b0" - integrity sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg== +"@jest/reporters@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.3.0.tgz#7f39f0e6911561cc5112a1b54656de18faee269b" + integrity sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^25.1.0" - "@jest/environment" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/transform" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/console" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -1045,12 +1146,11 @@ istanbul-lib-instrument "^4.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.0" - jest-haste-map "^25.1.0" - jest-resolve "^25.1.0" - jest-runtime "^25.1.0" - jest-util "^25.1.0" - jest-worker "^25.1.0" + istanbul-reports "^3.0.2" + jest-haste-map "^25.3.0" + jest-resolve "^25.3.0" + jest-util "^25.3.0" + jest-worker "^25.2.6" slash "^3.0.0" source-map "^0.6.0" string-length "^3.1.0" @@ -1059,78 +1159,98 @@ optionalDependencies: node-notifier "^6.0.0" -"@jest/source-map@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.1.0.tgz#b012e6c469ccdbc379413f5c1b1ffb7ba7034fb0" - integrity sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA== +"@jest/source-map@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.2.6.tgz#0ef2209514c6d445ebccea1438c55647f22abb4c" + integrity sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ== dependencies: callsites "^3.0.0" graceful-fs "^4.2.3" source-map "^0.6.0" -"@jest/test-result@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.1.0.tgz#847af2972c1df9822a8200457e64be4ff62821f7" - integrity sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg== +"@jest/test-result@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.3.0.tgz#137fab5e5c6fed36e5d40735d1eb029325e3bf06" + integrity sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw== dependencies: - "@jest/console" "^25.1.0" - "@jest/transform" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/console" "^25.3.0" + "@jest/types" "^25.3.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz#4df47208542f0065f356fcdb80026e3c042851ab" - integrity sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw== +"@jest/test-sequencer@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz#271ad5f2b8f8137d092ccedc87e16a50f8676209" + integrity sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg== dependencies: - "@jest/test-result" "^25.1.0" - jest-haste-map "^25.1.0" - jest-runner "^25.1.0" - jest-runtime "^25.1.0" + "@jest/test-result" "^25.3.0" + jest-haste-map "^25.3.0" + jest-runner "^25.3.0" + jest-runtime "^25.3.0" -"@jest/transform@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.1.0.tgz#221f354f512b4628d88ce776d5b9e601028ea9da" - integrity sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ== +"@jest/transform@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.2.6.tgz#007fd946dedf12d2a9eb5d4154faf1991d5f61ff" + integrity sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^25.1.0" + "@jest/types" "^25.2.6" babel-plugin-istanbul "^6.0.0" chalk "^3.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.3" - jest-haste-map "^25.1.0" - jest-regex-util "^25.1.0" - jest-util "^25.1.0" + jest-haste-map "^25.2.6" + jest-regex-util "^25.2.6" + jest-util "^25.2.6" micromatch "^4.0.2" pirates "^4.0.1" - realpath-native "^1.1.0" + realpath-native "^2.0.0" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^25.1.0": - version "25.1.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395" - integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA== +"@jest/transform@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.3.0.tgz#083c5447d5307d9b9494d6968115b647460e71f1" + integrity sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^25.3.0" + babel-plugin-istanbul "^6.0.0" + chalk "^3.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.3" + jest-haste-map "^25.3.0" + jest-regex-util "^25.2.6" + jest-util "^25.3.0" + micromatch "^4.0.2" + pirates "^4.0.1" + realpath-native "^2.0.0" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^25.2.6": + version "25.2.6" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6" + integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@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== +"@jest/types@^25.3.0": + version "25.3.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.3.0.tgz#88f94b277a1d028fd7117bc1f74451e0fc2131e7" + integrity sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw== dependencies: - apollo-link "^1.2.3" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" "@metascraper/helpers@^4.10.2": version "4.10.2" @@ -1155,13 +1275,13 @@ url-regex "~4.1.1" video-extensions "~1.1.0" -"@metascraper/helpers@^5.11.6": - version "5.11.6" - resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.11.6.tgz#2fef2f420f06f4f8903cc6f699ccb79195950a60" - integrity sha512-DKCJMz5Q4wrBPZVfJdeNarmW2WHm3Y7D6M78KKA/D0mcXPikKLoiBxjyPtjc5tEE/5er+PYFijDBmyTT60M2bg== +"@metascraper/helpers@^5.11.6", "@metascraper/helpers@^5.11.8": + version "5.11.8" + resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.11.8.tgz#24bf4440b4c24d1e5ba116005fbeb2ad3bf5b0cd" + integrity sha512-e0gpI2kOnlQ7nZH5amCNztN5GXNWPkA2rAkZhZ3ckpo1W5x4aw/h7FnOMjHftuNjeSWLeIplpn8VROJ9Hb3qyw== dependencies: audio-extensions "0.0.0" - chrono-node "~1.4.3" + chrono-node "~1.4.4" condense-whitespace "~2.0.0" entities "~2.0.0" file-extension "~4.0.5" @@ -1176,7 +1296,7 @@ mime-types "~2.1.26" normalize-url "~5.0.0" smartquotes "~2.3.1" - title "~3.4.1" + title "~3.4.2" truncate "~2.1.0" url-regex "~5.0.0" video-extensions "~1.1.0" @@ -1255,83 +1375,83 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@sentry/apm@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.14.2.tgz#b05b91a8da6826fdd20532cb745c0f9ef5c55656" - integrity sha512-51yeQ04mKEsx2WiXbMlUSXhmG/D+YFiNJXxKuFopJkKkT02qr7B3QH0vHkS9OX2oniYoBTWZVCKYUAgJUSsIug== +"@sentry/apm@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/apm/-/apm-5.15.4.tgz#59af766d2bb4c9d98eda5ddba7a32a79ecc807a2" + integrity sha512-gcW225Jls1ShyBXMWN6zZyuVJwBOIQ63sI+URI2NSFsdpBpdpZ8yennIm+oMlSfb25Nzt9SId7TRSjPhlSbTZQ== dependencies: - "@sentry/browser" "5.14.2" - "@sentry/hub" "5.14.2" - "@sentry/minimal" "5.14.2" - "@sentry/types" "5.14.2" - "@sentry/utils" "5.14.2" + "@sentry/browser" "5.15.4" + "@sentry/hub" "5.15.4" + "@sentry/minimal" "5.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" tslib "^1.9.3" -"@sentry/browser@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.14.2.tgz#b0d1bf7bd771e64de0f9f801fa6625e47fced016" - integrity sha512-Vuuy2E5mt2VQKeHpFqtowZdKUe1Ui7J2KmgZQCduVilM7dFmprdXfv/mQ3Uv+73VIiCd22PpxojR3peDksb/Gg== +"@sentry/browser@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.4.tgz#5a7e7bad088556665ed8e69bceb0e18784e4f6c7" + integrity sha512-l/auT1HtZM3KxjCGQHYO/K51ygnlcuOrM+7Ga8gUUbU9ZXDYw6jRi0+Af9aqXKmdDw1naNxr7OCSy6NBrLWVZw== dependencies: - "@sentry/core" "5.14.2" - "@sentry/types" "5.14.2" - "@sentry/utils" "5.14.2" + "@sentry/core" "5.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" tslib "^1.9.3" -"@sentry/core@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.14.2.tgz#950709a2281086c64f1ba60f2c3290dc81c19659" - integrity sha512-B2XjUMCmVu4H3s5hapgynhb28MSc+irt9wRI9j0Lbjx2cxsCUr/YFGL8GuEuYwf4zXNKnh2ke6t+I37OlSaGOg== +"@sentry/core@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.4.tgz#08b617e093a636168be5aebad141d1f744217085" + integrity sha512-9KP4NM4SqfV5NixpvAymC7Nvp36Zj4dU2fowmxiq7OIbzTxGXDhwuN/t0Uh8xiqlkpkQqSECZ1OjSFXrBldetQ== dependencies: - "@sentry/hub" "5.14.2" - "@sentry/minimal" "5.14.2" - "@sentry/types" "5.14.2" - "@sentry/utils" "5.14.2" + "@sentry/hub" "5.15.4" + "@sentry/minimal" "5.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" tslib "^1.9.3" -"@sentry/hub@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.14.2.tgz#24a0990a901d49f8a362dfd404cb7cd33e429d60" - integrity sha512-0ckTDnhCANkuY+VepMPz5vl/dkFQnWmzlJiCIxgM5fCgAF8dfNd9VhGn0qVQXnzKPGoW9zxs/uAmH3/XFqqmNA== +"@sentry/hub@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.4.tgz#cb64473725a60eec63b0be58ed1143eaaf894bee" + integrity sha512-1XJ1SVqadkbUT4zLS0TVIVl99si7oHizLmghR8LMFl5wOkGEgehHSoOydQkIAX2C7sJmaF5TZ47ORBHgkqclUg== dependencies: - "@sentry/types" "5.14.2" - "@sentry/utils" "5.14.2" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" tslib "^1.9.3" -"@sentry/minimal@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.14.2.tgz#9fa39cc6432a05aae22e892a1be3cc314c3b77c4" - integrity sha512-uih9a8KwFCQrWaGb3UxkrSntxMRT4EIlud158ZKlrsLaCOE6i08unOR4xWqlrXlKPySq16H4wjbBFQ56ogOWdQ== +"@sentry/minimal@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.4.tgz#113f01fefb86b7830994c3dfa7ad4889ba7b2003" + integrity sha512-GL4GZ3drS9ge+wmxkHBAMEwulaE7DMvAEfKQPDAjg2p3MfcCMhAYfuY4jJByAC9rg9OwBGGehz7UmhWMFjE0tw== dependencies: - "@sentry/hub" "5.14.2" - "@sentry/types" "5.14.2" + "@sentry/hub" "5.15.4" + "@sentry/types" "5.15.4" tslib "^1.9.3" -"@sentry/node@^5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.14.2.tgz#18c25a0ca34b6ea4e3d917a819e97d086d8b1c2c" - integrity sha512-8s9JAKc/oid6lIFbYLtCLDwLhUpsgeU1WdNbs1eUJQSArb6WHS6EREVBuGr3RMfe+SkwEMg1rtPKnyj4C/WRig== +"@sentry/node@^5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.15.4.tgz#e7bc3962d321a12b633743200165ca5f1757cb68" + integrity sha512-OfdhNEvOJZ55ZkCUcVgctjaZkOw7rmLzO5VyDTSgevA4uLsPaTNXSAeK2GSQBXc5J0KdRpNz4sSIyuxOS4Z7Vg== dependencies: - "@sentry/apm" "5.14.2" - "@sentry/core" "5.14.2" - "@sentry/hub" "5.14.2" - "@sentry/types" "5.14.2" - "@sentry/utils" "5.14.2" + "@sentry/apm" "5.15.4" + "@sentry/core" "5.15.4" + "@sentry/hub" "5.15.4" + "@sentry/types" "5.15.4" + "@sentry/utils" "5.15.4" cookie "^0.3.1" https-proxy-agent "^4.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/types@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.14.2.tgz#43c3723b2f5b31234892fbe6a28b293ad050faac" - integrity sha512-NtB/o+/whR/mJJf67Nvdab7E2+/THgAUY114FWFqDLHMaoiIVWy9J/yLKtQWymwuQslh7zpPxjA1AhqTJerVCg== +"@sentry/types@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.15.4.tgz#37f30e35b06e8e12ad1101f1beec3e9b88ca1aab" + integrity sha512-quPHPpeAuwID48HLPmqBiyXE3xEiZLZ5D3CEbU3c3YuvvAg8qmfOOTI6z4Z3Eedi7flvYpnx3n7N3dXIEz30Eg== -"@sentry/utils@5.14.2": - version "5.14.2" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.14.2.tgz#2e812f2788a00ca4e6e35acbeb86000792f53473" - integrity sha512-DV9/kw/O8o5xqvQYwITm0lBaBqS4RKicjguWYJQ/+F94P/SKxuXor7EE0iMDYvUGslvPz8TlgB7r+nb/YRl+Fg== +"@sentry/utils@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.15.4.tgz#02865ab3c9b745656cea0ab183767ec26c96f6e6" + integrity sha512-lO8SLBjrUDGADl0LOkd55R5oL510d/1SaI08/IBHZCxCUwI4TiYo5EPECq8mrj3XGfgCyq9osw33bymRlIDuSQ== dependencies: - "@sentry/types" "5.14.2" + "@sentry/types" "5.15.4" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -1371,6 +1491,17 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" +"@types/babel__core@^7.1.7": + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89" + integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + "@types/babel__generator@*": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" @@ -1438,10 +1569,10 @@ "@types/node" "*" "@types/range-parser" "*" -"@types/express@*", "@types/express@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c" - integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA== +"@types/express@*", "@types/express@4.17.3": + version "4.17.3" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.3.tgz#38e4458ce2067873b09a73908df488870c303bd9" + integrity sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" @@ -1550,6 +1681,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.16.tgz#4d690c96cbb7b2728afea0e260d680501b3da5cf" integrity sha512-/opXIbfn0P+VLt+N8DE4l8Mn8rbhiJgabU96ZJ0p9mxOkIks5gh6RUnpHak7Yh0SFkyjO/ODbxsQQPV2bpMmyA== +"@types/prettier@^1.19.0": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f" + integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ== + "@types/range-parser@*": version "1.2.3" resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" @@ -1587,10 +1723,10 @@ dependencies: "@types/yargs-parser" "*" -"@types/yup@0.26.33": - version "0.26.33" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.33.tgz#301faab47b952a4a5f9a06246942cc7cbd09cd95" - integrity sha512-QzgcNfDtRIph8CjfoWiu+MJiOUp25Yo7FthuOHLVbtCTyonjOo2YRsFzKo3csDWbTXlw5NedOFH0Nje7yipCrA== +"@types/yup@0.26.34": + version "0.26.34" + resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.34.tgz#199329f9fee5074a7385b4a4a25d1559db628aef" + integrity sha512-/zH/Yuwl2vC5fgPE+Qtv67iI/o50qLJJsR0KVc86cpDlY2IsRv3yJop1v/9hfNrgy7J8J5BpJM4BMhyFE3QE4w== "@types/zen-observable@^0.8.0": version "0.8.0" @@ -1784,13 +1920,13 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-cache-control@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.9.0.tgz#43d2eec16d40248683f46b9b28937a89ad3b5c54" - integrity sha512-iLT6IT4Ul5cMfBcJAvhpk3a7AD6fXqvFxNmJEPVapVJHbSKYIjra4PTis13sOyN5Y3WQS6a+NRFxAW8+hL3q3Q== +apollo-cache-control@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.9.1.tgz#2af4c53ef697a87808285a25f2b93ca0f183880c" + integrity sha512-9t2EcRevUrANuGhF5XUbKJEfnc6Jy2Rn7Y8nOIKlsEEC+AX7Ko4svWYTyyTxj0h0RXfiegY2nbz4sVry/pS3rA== dependencies: apollo-server-env "^2.4.3" - graphql-extensions "^0.11.0" + graphql-extensions "^0.11.1" apollo-cache-inmemory@~1.6.5: version "1.6.5" @@ -1840,19 +1976,19 @@ apollo-engine-reporting-protobuf@^0.4.4: dependencies: "@apollo/protobufjs" "^1.0.3" -apollo-engine-reporting@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.7.0.tgz#34a54ef96da5cfe1dea3a4fdf02768d1cc7e154f" - integrity sha512-jsjSnoHrRmk4XXK4aFU17YSJILmWsilKRwIeN74QJsSxjn5SCVF4EI/ebf/MNrTHpft8EhShx+wdkAcOD9ivqA== +apollo-engine-reporting@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.7.1.tgz#469d9711507ef4c3b03f193a9b422ecf7ecff7e9" + integrity sha512-9ykddPxlC95R9CkkJaPaGriRbOGfzeKqqPXRAunyX1h4sG/8g+MJ/gGzmnNf63k6RvRUdRENCE83wPk2OeU+2A== dependencies: apollo-engine-reporting-protobuf "^0.4.4" apollo-graphql "^0.4.0" apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" - apollo-server-errors "^2.4.0" - apollo-server-types "^0.3.0" + apollo-server-errors "^2.4.1" + apollo-server-types "^0.3.1" async-retry "^1.2.1" - graphql-extensions "^0.11.0" + graphql-extensions "^0.11.1" apollo-env@^0.6.1: version "0.6.1" @@ -1880,41 +2016,41 @@ apollo-graphql@^0.4.0: apollo-env "^0.6.1" lodash.sortby "^4.7.0" -apollo-link-context@~1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.19.tgz#3c9ba5bf75ed5428567ce057b8837ef874a58987" - integrity sha512-TUi5TyufU84hEiGkpt+5gdH5HkB3Gx46npNfoxR4of3DKBCMuItGERt36RCaryGcU/C3u2zsICU3tJ+Z9LjFoQ== +apollo-link-context@~1.0.20: + version "1.0.20" + resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.20.tgz#1939ac5dc65d6dff0c855ee53521150053c24676" + integrity sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA== dependencies: - apollo-link "^1.2.13" + apollo-link "^1.2.14" tslib "^1.9.3" -apollo-link-http-common@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz#304e67705122bf69a9abaded4351b10bc5efd6d9" - integrity sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg== +apollo-link-http-common@^0.2.15, apollo-link-http-common@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" + integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== dependencies: - apollo-link "^1.2.13" + apollo-link "^1.2.14" ts-invariant "^0.4.0" tslib "^1.9.3" -apollo-link-http@~1.5.16: - version "1.5.16" - resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.16.tgz#44fe760bcc2803b8a7f57fc9269173afb00f3814" - integrity sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw== +apollo-link-http@~1.5.17: + version "1.5.17" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba" + integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg== dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" tslib "^1.9.3" -apollo-link@^1.0.0, apollo-link@^1.2.13, apollo-link@^1.2.3: - version "1.2.13" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.13.tgz#dff00fbf19dfcd90fddbc14b6a3f9a771acac6c4" - integrity sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw== +apollo-link@^1.0.0, apollo-link@^1.2.13, apollo-link@^1.2.14, apollo-link@^1.2.3: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== dependencies: apollo-utilities "^1.3.0" ts-invariant "^0.4.0" tslib "^1.9.3" - zen-observable-ts "^0.8.20" + zen-observable-ts "^0.8.21" apollo-server-caching@^0.5.1: version "0.5.1" @@ -1923,29 +2059,30 @@ apollo-server-caching@^0.5.1: dependencies: lru-cache "^5.0.0" -apollo-server-core@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.11.0.tgz#91a055ce6cf12a8b43e8a4811d465d97fa324eac" - integrity sha512-jHLOqwTRlyWzqWNRlwr2M/xfrt+lw2pHtKYyxUGRjWFo8EM5TX1gDcTKtbtvx9p5m+ZBDAhcWp/rpq0vSz4tqg== +apollo-server-core@^2.11.0, apollo-server-core@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.12.0.tgz#980f29788c17f029e7248d331bee1ad2e1f07e5b" + integrity sha512-BRVdOyZrRJ1ALlmis0vaOLIHHYu5K3UVKAQKIgHkRh/YY0Av4lpeEXr49ELK04LTeh0DG0pQ5YYYhaX1wFcDEw== dependencies: "@apollographql/apollo-tools" "^0.4.3" "@apollographql/graphql-playground-html" "1.6.24" "@types/graphql-upload" "^8.0.0" "@types/ws" "^6.0.0" - apollo-cache-control "^0.9.0" + apollo-cache-control "^0.9.1" apollo-datasource "^0.7.0" - apollo-engine-reporting "^1.7.0" + apollo-engine-reporting "^1.7.1" apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" - apollo-server-errors "^2.4.0" - apollo-server-plugin-base "^0.7.0" - apollo-server-types "^0.3.0" - apollo-tracing "^0.9.0" + apollo-server-errors "^2.4.1" + apollo-server-plugin-base "^0.7.1" + apollo-server-types "^0.3.1" + apollo-tracing "^0.9.1" fast-json-stable-stringify "^2.0.0" - graphql-extensions "^0.11.0" + graphql-extensions "^0.11.1" graphql-tag "^2.9.2" graphql-tools "^4.0.0" graphql-upload "^8.0.2" + loglevel "^1.6.7" sha.js "^2.4.11" subscriptions-transport-ws "^0.9.11" ws "^6.0.0" @@ -1958,24 +2095,24 @@ apollo-server-env@^2.4.3: node-fetch "^2.1.2" util.promisify "^1.0.0" -apollo-server-errors@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.0.tgz#3096db02b6ae8d434a6b2678f74eddaad8b98452" - integrity sha512-ZouZfr2sGavvI18rgdRcyY2ausRAlVtWNOax9zca8ZG2io86dM59jXBmUVSNlVZSmBsIh45YxYC0eRvr2vmRdg== +apollo-server-errors@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.4.1.tgz#16ad49de6c9134bfb2b7dede9842e73bb239dbe2" + integrity sha512-7oEd6pUxqyWYUbQ9TA8tM0NU/3aGtXSEibo6+txUkuHe7QaxfZ2wHRp+pfT1LC1K3RXYjKj61/C2xEO19s3Kdg== -apollo-server-express@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.11.0.tgz#ef59a15f6f9ba8a8fb90cfa8b7c4c436be6e84c0" - integrity sha512-9bbiD+zFAx+xyurc9lxYmNa9y79k/gsA1vEyPFVcv7jxzCFC5wc0tcbV7NPX2qi1Nn7K76fxo2fPNYbPFX/y0g== +apollo-server-express@^2.11.0, apollo-server-express@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.12.0.tgz#a03cef8a3aa753bff73156e6a31fd59a076dc48b" + integrity sha512-oTBKM2SsziCoFW+ta+ubJ/ypvsc+EWrbJnyZhJ5FBYzSXPstt/jvgZHgMO+kOQgHEHrbJwugNDUuLMSm608L7A== dependencies: "@apollographql/graphql-playground-html" "1.6.24" "@types/accepts" "^1.3.5" "@types/body-parser" "1.19.0" "@types/cors" "^2.8.4" - "@types/express" "4.17.2" + "@types/express" "4.17.3" accepts "^1.3.5" - apollo-server-core "^2.11.0" - apollo-server-types "^0.3.0" + apollo-server-core "^2.12.0" + apollo-server-types "^0.3.1" body-parser "^1.18.3" cors "^2.8.4" express "^4.17.1" @@ -1985,12 +2122,12 @@ apollo-server-express@^2.11.0: subscriptions-transport-ws "^0.9.16" type-is "^1.6.16" -apollo-server-plugin-base@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.7.0.tgz#5c52ee311c8ef884b8b17be1b7e9d4597966dae1" - integrity sha512-//xgYrBYLQSr92W0z3mYsFGoVz3wxKNsv3KcOUBhbOCGTbjZgP7vHOE1vhHhRcpZKKXmjXTVONdrnNJ+XVGi6A== +apollo-server-plugin-base@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-0.7.1.tgz#998d035723c5993171fd5aff3dbe7d2661db1a96" + integrity sha512-PRavvoWq7/Xufqc+qkDQg3Aqueq4QrPBFfoCFIjhkJ4n2d2YoqE3gTGccb8YoWusfa62ASMn6R47OdNuVtEbXw== dependencies: - apollo-server-types "^0.3.0" + apollo-server-types "^0.3.1" apollo-server-testing@~2.11.0: version "2.11.0" @@ -1999,10 +2136,10 @@ apollo-server-testing@~2.11.0: dependencies: apollo-server-core "^2.11.0" -apollo-server-types@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.3.0.tgz#01732e5fc6c4a2a522f051d5685c57a8e3dc620e" - integrity sha512-FMo7kbTkhph9dfIQ3xDbRLObqmdQH9mwSjxhGsX+JxGMRPPXgd3+GZvCeVKOi/udxh//w1otSeAqItjvbj0tfQ== +apollo-server-types@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-0.3.1.tgz#9456e243dad525a78b689246f124a66d7d8ac409" + integrity sha512-6nX5VC3icOGf1RZIs7/SYQZff+Cl16LQu1FHUOIk9gAMN2XjlRCyJgCeMj5YHJzQ8Mhg4BO0weWuydEg+JxLzg== dependencies: apollo-engine-reporting-protobuf "^0.4.4" apollo-server-caching "^0.5.1" @@ -2019,13 +2156,13 @@ apollo-server@~2.11.0: graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" -apollo-tracing@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.9.0.tgz#673916ae674b9a8d72603f73af0b8561dfd38306" - integrity sha512-oqspTrf4BLGbKkIk1vF+I31C2v7PPJmF36TFpT/+zJxNvJw54ji4ZMhtytgVqbVldQEintJmdHQIidYBGKmu+g== +apollo-tracing@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.9.1.tgz#c481be727550c73fda53d20d798cbe4ad67c61bd" + integrity sha512-4wVNM6rc70XhwWxuDWrMBLaHA8NjB9pUS2sNpddQvP36ZtQfsa08XLSUxGAZT+bej+TzW26hKNtuO31RgqC9Hg== dependencies: apollo-server-env "^2.4.3" - graphql-extensions "^0.11.0" + graphql-extensions "^0.11.1" apollo-utilities@1.3.3, apollo-utilities@^1.0.1, apollo-utilities@^1.3.0, apollo-utilities@^1.3.3: version "1.3.3" @@ -2210,6 +2347,21 @@ audio-extensions@0.0.0: resolved "https://registry.yarnpkg.com/audio-extensions/-/audio-extensions-0.0.0.tgz#d0eefe077fb9eb625898eed9985890548cf1f8d2" integrity sha1-0O7+B3+562JYmO7ZmFiQVIzx+NI= +aws-sdk@^2.652.0: + version "2.652.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.652.0.tgz#00a4dd3a4ce588448895c42d25e967f2a23b487c" + integrity sha512-THMlf3CX/IKMh+jizDQ+XCf5LSp1x+rIl+4uIRJjMj+zHNes7zJy3DSkuu5gux5aG5x4God996vPdCus+F22JA== + dependencies: + buffer "4.9.1" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.15.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.3.2" + xml2js "0.4.19" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2237,16 +2389,29 @@ babel-eslint@~10.1.0: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-jest@^25.1.0, babel-jest@~25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.1.0.tgz#206093ac380a4b78c4404a05b3277391278f80fb" - integrity sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg== +babel-jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.3.0.tgz#999d0c19e8427f66b796bf9ea233eedf087b957c" + integrity sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg== dependencies: - "@jest/transform" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^25.3.0" + chalk "^3.0.0" + slash "^3.0.0" + +babel-jest@~25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.2.6.tgz#fe67ff4d0db3626ca8082da8881dd5e84e07ae75" + integrity sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ== + dependencies: + "@jest/transform" "^25.2.6" + "@jest/types" "^25.2.6" "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^25.1.0" + babel-preset-jest "^25.2.6" chalk "^3.0.0" slash "^3.0.0" @@ -2268,10 +2433,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz#fb62d7b3b53eb36c97d1bc7fec2072f9bd115981" - integrity sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw== +babel-plugin-jest-hoist@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz#2af07632b8ac7aad7d414c1e58425d5fc8e84909" + integrity sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw== dependencies: "@types/babel__traverse" "^7.0.6" @@ -2282,14 +2447,38 @@ babel-plugin-transform-runtime@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-preset-jest@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz#d0aebfebb2177a21cde710996fce8486d34f1d33" - integrity sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ== +babel-preset-current-node-syntax@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz#fb4a4c51fe38ca60fede1dc74ab35eb843cb41d6" + integrity sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +babel-preset-jest@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz#5d3f7c99e2a8508d61775c9d68506d143b7f71b5" + integrity sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ== dependencies: "@babel/plugin-syntax-bigint" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^25.1.0" + babel-plugin-jest-hoist "^25.2.6" + +babel-preset-jest@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz#9ab40aee52a19bdc52b8b1ec2403d5914ac3d86b" + integrity sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw== + dependencies: + babel-plugin-jest-hoist "^25.2.6" + babel-preset-current-node-syntax "^0.1.2" babel-runtime@^6.22.0: version "6.26.0" @@ -2309,6 +2498,11 @@ 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.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2436,7 +2630,7 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" -browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.9.1: +browserslist@^4.8.3, browserslist@^4.9.1: version "4.9.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.9.1.tgz#01ffb9ca31a1aef7678128fc6a2253316aa7287c" integrity sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw== @@ -2462,6 +2656,15 @@ 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" + busboy@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" @@ -2507,6 +2710,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -2666,10 +2877,10 @@ chrono-node@~1.3.11: dependencies: moment "2.21.0" -chrono-node@~1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.4.3.tgz#4c8e24643ec5e576f6f8fe0429370c3b554491b4" - integrity sha512-ZyKcnTcr8i7Mt9p4+ixMHEuR6+eMTrjYCL9Rm9TZHviLleCtcZoVzmr2uSc+Vg8MX1YbNCnPbEd4rfV8WvzLcw== +chrono-node@~1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/chrono-node/-/chrono-node-1.4.4.tgz#a6248257d3198996ea3d023b2bd20a268545350f" + integrity sha512-vwsQ2Z6RhkfIsFYvcZtifa0eSQC6pl08fgXkcZXkfGAJk/OkdYAuGqM2yLhPzsuK3N+BmaKFBie/jGvLsiYMbA== dependencies: dayjs "^1.8.19" @@ -2811,7 +3022,7 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3120,10 +3331,10 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.0.tgz#ec2b44977465b9dcb370021d5e6c019b19f36d06" - integrity sha512-8P1cDi8ebZyDxUyUprBXwidoEtiQAawYPGvpfb+Dg0G6JrQ+VozwOmm91xYC0vAv1+0VmLehEPb+isg4BGUFfA== +date-fns@2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" + integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== dateformat@^2.0.0: version "2.2.0" @@ -3190,7 +3401,7 @@ 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@4.2.2: +deepmerge@4.2.2, deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== @@ -3281,10 +3492,10 @@ dicer@0.3.0: dependencies: streamsearch "0.1.2" -diff-sequences@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32" - integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw== +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== diff@^4.0.1: version "4.0.1" @@ -3603,17 +3814,17 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@~6.10.0: - version "6.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f" - integrity sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg== +eslint-config-prettier@~6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" + integrity sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ== dependencies: get-stdin "^6.0.0" -eslint-config-standard@~14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz#b23da2b76fe5a2eba668374f246454e7058f15d4" - integrity sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA== +eslint-config-standard@~14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" + integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== eslint-import-resolver-node@^0.3.2: version "0.3.2" @@ -3639,10 +3850,10 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" -eslint-plugin-import@~2.20.1: - version "2.20.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3" - integrity sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw== +eslint-plugin-import@~2.20.2: + version "2.20.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" + integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== dependencies: array-includes "^3.0.3" array.prototype.flat "^1.2.1" @@ -3664,10 +3875,10 @@ eslint-plugin-jest@~23.8.2: dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" -eslint-plugin-node@~11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz#365944bb0804c5d1d501182a9bc41a0ffefed726" - integrity sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg== +eslint-plugin-node@~11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== dependencies: eslint-plugin-es "^3.0.0" eslint-utils "^2.0.0" @@ -3811,6 +4022,11 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +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" @@ -3894,17 +4110,17 @@ expect-ct@0.2.0: resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.2.0.tgz#3a54741b6ed34cc7a93305c605f63cd268a54a62" integrity sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g== -expect@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-25.1.0.tgz#7e8d7b06a53f7d66ec927278db3304254ee683ee" - integrity sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g== +expect@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-25.3.0.tgz#5fd36e51befd05afb7184bc954f8a4792d184c71" + integrity sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" ansi-styles "^4.0.0" - jest-get-type "^25.1.0" - jest-matcher-utils "^25.1.0" - jest-message-util "^25.1.0" - jest-regex-util "^25.1.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-regex-util "^25.2.6" express@^4.0.0, express@^4.17.1: version "4.17.1" @@ -3990,6 +4206,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-files@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-7.0.0.tgz#3dc7853320ff7876ec62d6e98f2f4e6f3e6282f6" + integrity sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ== + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -4172,6 +4393,15 @@ form-data@^2.3.1: combined-stream "^1.0.6" mime-types "^2.1.12" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4463,14 +4693,14 @@ graphql-custom-directives@~0.2.14: moment "^2.22.2" numeral "^2.0.6" -graphql-extensions@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.11.0.tgz#2923b06f7452dad186d835327974b6c3ebb9c58f" - integrity sha512-zd4qfUiJoYBx2MwJusM36SEJ+YmJ1ki8YF8nlm9mgaPDUzsnmFq4lxULxUfhLAXFwZw7MbEN2vV4V6WiNgSJLg== +graphql-extensions@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.11.1.tgz#f543f544a047a7a4dd930123f662dfcc01527416" + integrity sha512-1bstq6YKaC579PTw9gchw2VlXqjPo3vn8NjRMaUqF2SxyYTjVSgXaCAbaeNa0B7xlLVigxi3DV1zh4A+ss+Lwg== dependencies: "@apollographql/apollo-tools" "^0.4.3" apollo-server-env "^2.4.3" - apollo-server-types "^0.3.0" + apollo-server-types "^0.3.1" graphql-iso-date@~3.6.1: version "3.6.1" @@ -4498,12 +4728,12 @@ graphql-redis-subscriptions@^2.2.1: optionalDependencies: ioredis "^4.6.3" -graphql-shield@~7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.2.1.tgz#baca0c31a19593ede41a4bb4d476f9edd1d0eb78" - integrity sha512-EEoVYvXuqAGXGH1i9Aot4MJIUlRABVycwKRGaBreabys7yTd+0zGwudKB9yZiW3SEMIjHkz3a0r/ILhYzq0uiw== +graphql-shield@~7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.2.2.tgz#daf9a91c6b8487b5f00dea12c8ab3bb85947471a" + integrity sha512-Zab6O+xHHfyxVoyEROnkjw3Ep23C7oYtqYKbuXEyenaPgif9ncUp+JKA3GA2HEzVjkxw/psfSeaQWWz3VFtXeA== dependencies: - "@types/yup" "0.26.33" + "@types/yup" "0.26.34" object-hash "^2.0.3" yup "^0.28.3" @@ -4519,6 +4749,20 @@ graphql-tag@^2.9.2, graphql-tag@~2.10.3: resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== +graphql-tools-fork@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/graphql-tools-fork/-/graphql-tools-fork-9.0.1.tgz#fc8df40c108bdba3268999dea355cc614c765038" + integrity sha512-kM6mUNVekgnWKtVqLGQ9HvQqQ3zZVPZRg1esltBoohsbUMaChl+9QkjBjoMxnZPnbTGOOGGagopNBQALIBysNg== + dependencies: + apollo-link "^1.2.13" + apollo-link-http-common "^0.2.15" + deprecated-decorator "^0.1.6" + extract-files "^7.0.0" + form-data "^3.0.0" + iterall "^1.3.0" + node-fetch "^2.6.0" + uuid "^7.0.2" + graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-4.0.5.tgz#d2b41ee0a330bfef833e5cdae7e1f0b0d86b1754" @@ -4662,20 +4906,20 @@ helmet-crossdomain@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.9.5: - version "2.9.5" - resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.9.5.tgz#ea1ebec6d481e8f9aa5f48cc4ca2714e031f627d" - integrity sha512-w9nps5adqFQwgktVPDbXkARmZot/nr8aegzQas9AXdBSwBFBBefPpDSTV0wtgHlAUdDwY6MZo7qAl9yts3ppJg== +helmet-csp@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/helmet-csp/-/helmet-csp-2.10.0.tgz#685dde1747bc16c5e28ad9d91e229a69f0a85e84" + integrity sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w== dependencies: bowser "2.9.0" camelize "1.0.0" content-security-policy-builder "2.1.0" dasherize "2.0.0" -helmet@~3.21.3: - version "3.21.3" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.21.3.tgz#15777aae82a4d2678c104fd18195a4012f429b67" - integrity sha512-8OjGNdpG3WQhPO71fSy2fT4X3FSNutU1LDeAf+YS+Vil6r+fE7w8per5mNed6egGYbZl3QhKXgFzMYSwys+YQw== +helmet@~3.22.0: + version "3.22.0" + resolved "https://registry.yarnpkg.com/helmet/-/helmet-3.22.0.tgz#3a6f11d931799145f0aff15dbc563cff9e13131f" + integrity sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA== dependencies: depd "2.0.0" dns-prefetch-control "0.2.0" @@ -4684,7 +4928,7 @@ helmet@~3.21.3: feature-policy "0.3.0" frameguard "3.1.0" helmet-crossdomain "0.4.0" - helmet-csp "2.9.5" + helmet-csp "2.10.0" hide-powered-by "1.1.0" hpkp "2.0.0" hsts "2.2.0" @@ -4822,6 +5066,11 @@ 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.13, ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + ienoopen@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ienoopen/-/ienoopen-1.1.0.tgz#411e5d530c982287dbdc3bb31e7a9c9e32630974" @@ -4952,10 +5201,10 @@ invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ioredis@^4.16.0, ioredis@^4.6.3: - version "4.16.0" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.16.0.tgz#44d51288e20da14e5b6f687b2db0312e69106556" - integrity sha512-tlalhtuvnxXJNtrPjec1nGicuOCpi9ErYV/fRfwaWSzktX9ESrzHlcFwj1pVAL326E8dmt7h9pPQZyyVPPksRA== +ioredis@^4.16.1, ioredis@^4.6.3: + version "4.16.1" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.16.1.tgz#377c21d2a4fa8cc31fe9028c666f8dd16a6255bf" + integrity sha512-g76Mm9dE7BLuewncu1MimGZw5gDDjDwjoRony/VoSxSJEKAhuYncDEwYKYjtHi2NWsTNIB6XXRjE64uVa/wpKQ== dependencies: cluster-key-slot "^1.1.0" debug "^4.1.1" @@ -5366,10 +5615,10 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.0.tgz#d4d16d035db99581b6194e119bbf36c963c5eb70" - integrity sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A== +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -5379,353 +5628,391 @@ iterall@^1.1.3, iterall@^1.2.1, iterall@^1.2.2, iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jest-changed-files@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.1.0.tgz#73dae9a7d9949fdfa5c278438ce8f2ff3ec78131" - integrity sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA== +jest-changed-files@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.3.0.tgz#85d8de6f4bd13dafda9d7f1e3f2565fc0e183c78" + integrity sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" execa "^3.2.0" throat "^5.0.0" -jest-cli@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.1.0.tgz#75f0b09cf6c4f39360906bf78d580be1048e4372" - integrity sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg== +jest-cli@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.3.0.tgz#d9e11f5700cc5946583cf0d01a9bdebceed448d2" + integrity sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw== dependencies: - "@jest/core" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/core" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" chalk "^3.0.0" exit "^0.1.2" import-local "^3.0.2" is-ci "^2.0.0" - jest-config "^25.1.0" - jest-util "^25.1.0" - jest-validate "^25.1.0" + jest-config "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^15.0.0" + realpath-native "^2.0.0" + yargs "^15.3.1" -jest-config@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.1.0.tgz#d114e4778c045d3ef239452213b7ad3ec1cbea90" - integrity sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw== +jest-config@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.3.0.tgz#112b5e2f2e57dec4501dd2fe979044c06fb1317e" + integrity sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^25.1.0" - "@jest/types" "^25.1.0" - babel-jest "^25.1.0" + "@jest/test-sequencer" "^25.3.0" + "@jest/types" "^25.3.0" + babel-jest "^25.3.0" chalk "^3.0.0" + deepmerge "^4.2.2" glob "^7.1.1" - jest-environment-jsdom "^25.1.0" - jest-environment-node "^25.1.0" - jest-get-type "^25.1.0" - jest-jasmine2 "^25.1.0" - jest-regex-util "^25.1.0" - jest-resolve "^25.1.0" - jest-util "^25.1.0" - jest-validate "^25.1.0" + jest-environment-jsdom "^25.3.0" + jest-environment-node "^25.3.0" + jest-get-type "^25.2.6" + jest-jasmine2 "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" micromatch "^4.0.2" - pretty-format "^25.1.0" - realpath-native "^1.1.0" + pretty-format "^25.3.0" + realpath-native "^2.0.0" -jest-diff@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad" - integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw== +jest-diff@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.3.0.tgz#0d7d6f5d6171e5dacde9e05be47b3615e147c26f" + integrity sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w== dependencies: chalk "^3.0.0" - diff-sequences "^25.1.0" - jest-get-type "^25.1.0" - pretty-format "^25.1.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.3.0" -jest-docblock@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.1.0.tgz#0f44bea3d6ca6dfc38373d465b347c8818eccb64" - integrity sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA== +jest-docblock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef" + integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg== dependencies: detect-newline "^3.0.0" -jest-each@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.1.0.tgz#a6b260992bdf451c2d64a0ccbb3ac25e9b44c26a" - integrity sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A== +jest-each@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.3.0.tgz#a319eecf1f6076164ab86f99ca166a55b96c0bd4" + integrity sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" chalk "^3.0.0" - jest-get-type "^25.1.0" - jest-util "^25.1.0" - pretty-format "^25.1.0" + jest-get-type "^25.2.6" + jest-util "^25.3.0" + pretty-format "^25.3.0" -jest-environment-jsdom@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz#6777ab8b3e90fd076801efd3bff8e98694ab43c3" - integrity sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ== +jest-environment-jsdom@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz#c493ab8c41f28001520c70ef67dd88b88be6af05" + integrity sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg== dependencies: - "@jest/environment" "^25.1.0" - "@jest/fake-timers" "^25.1.0" - "@jest/types" "^25.1.0" - jest-mock "^25.1.0" - jest-util "^25.1.0" - jsdom "^15.1.1" + "@jest/environment" "^25.3.0" + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" + jsdom "^15.2.1" -jest-environment-node@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.1.0.tgz#797bd89b378cf0bd794dc8e3dca6ef21126776db" - integrity sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw== +jest-environment-node@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.3.0.tgz#9845f0e63991e8498448cb0ae804935689533db9" + integrity sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g== dependencies: - "@jest/environment" "^25.1.0" - "@jest/fake-timers" "^25.1.0" - "@jest/types" "^25.1.0" - jest-mock "^25.1.0" - jest-util "^25.1.0" + "@jest/environment" "^25.3.0" + "@jest/fake-timers" "^25.3.0" + "@jest/types" "^25.3.0" + jest-mock "^25.3.0" + jest-util "^25.3.0" + semver "^6.3.0" -jest-get-type@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876" - integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw== +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== -jest-haste-map@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.1.0.tgz#ae12163d284f19906260aa51fd405b5b2e5a4ad3" - integrity sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw== +jest-haste-map@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.2.6.tgz#4aa6bcfa15310afccdb9ca77af58a98add8cedb8" + integrity sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.2.6" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.3" - jest-serializer "^25.1.0" - jest-util "^25.1.0" - jest-worker "^25.1.0" + jest-serializer "^25.2.6" + jest-util "^25.2.6" + jest-worker "^25.2.6" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" + which "^2.0.2" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz#681b59158a430f08d5d0c1cce4f01353e4b48137" - integrity sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg== +jest-haste-map@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.3.0.tgz#b7683031c9c9ddc0521d311564108b244b11e4c6" + integrity sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A== + dependencies: + "@jest/types" "^25.3.0" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.3" + jest-serializer "^25.2.6" + jest-util "^25.3.0" + jest-worker "^25.2.6" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + which "^2.0.2" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz#16ae4f68adef65fb45001b26c864bcbcbf972830" + integrity sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^25.1.0" - "@jest/source-map" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/environment" "^25.3.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" chalk "^3.0.0" co "^4.6.0" - expect "^25.1.0" + expect "^25.3.0" is-generator-fn "^2.0.0" - jest-each "^25.1.0" - jest-matcher-utils "^25.1.0" - jest-message-util "^25.1.0" - jest-runtime "^25.1.0" - jest-snapshot "^25.1.0" - jest-util "^25.1.0" - pretty-format "^25.1.0" + jest-each "^25.3.0" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-runtime "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + pretty-format "^25.3.0" throat "^5.0.0" -jest-leak-detector@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz#ed6872d15aa1c72c0732d01bd073dacc7c38b5c6" - integrity sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w== +jest-leak-detector@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz#5b6bf04903b35be56038915a55f47291771f769f" + integrity sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw== dependencies: - jest-get-type "^25.1.0" - pretty-format "^25.1.0" + jest-get-type "^25.2.6" + pretty-format "^25.3.0" -jest-matcher-utils@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz#fa5996c45c7193a3c24e73066fc14acdee020220" - integrity sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ== +jest-matcher-utils@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz#76765788a26edaa8bc5f0100aea52ae383559648" + integrity sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg== dependencies: chalk "^3.0.0" - jest-diff "^25.1.0" - jest-get-type "^25.1.0" - pretty-format "^25.1.0" + jest-diff "^25.3.0" + jest-get-type "^25.2.6" + pretty-format "^25.3.0" -jest-message-util@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.1.0.tgz#702a9a5cb05c144b9aa73f06e17faa219389845e" - integrity sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ== +jest-message-util@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.3.0.tgz#e3836826fe5ca538a337b87d9bd2648190867f85" + integrity sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" "@types/stack-utils" "^1.0.1" chalk "^3.0.0" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^1.0.1" -jest-mock@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.1.0.tgz#411d549e1b326b7350b2e97303a64715c28615fd" - integrity sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag== +jest-mock@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.3.0.tgz#d72644509e40987a732a9a2534a1054f4649402c" + integrity sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" jest-pnp-resolver@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-regex-util@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.1.0.tgz#efaf75914267741838e01de24da07b2192d16d87" - integrity sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w== +jest-regex-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964" + integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw== -jest-resolve-dependencies@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz#8a1789ec64eb6aaa77fd579a1066a783437e70d2" - integrity sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw== +jest-resolve-dependencies@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz#b0e4ae053dd44ddacc18c6ee12b5b7c28e445a90" + integrity sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA== dependencies: - "@jest/types" "^25.1.0" - jest-regex-util "^25.1.0" - jest-snapshot "^25.1.0" + "@jest/types" "^25.3.0" + jest-regex-util "^25.2.6" + jest-snapshot "^25.3.0" -jest-resolve@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.1.0.tgz#23d8b6a4892362baf2662877c66aa241fa2eaea3" - integrity sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ== +jest-resolve@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.3.0.tgz#cb90a5bbea54a02eccdbbf4126a819595dcf91d6" + integrity sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" browser-resolve "^1.11.3" chalk "^3.0.0" jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" + realpath-native "^2.0.0" + resolve "^1.15.1" -jest-runner@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.1.0.tgz#fef433a4d42c89ab0a6b6b268e4a4fbe6b26e812" - integrity sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w== +jest-runner@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.3.0.tgz#673ef2ac79d2810eb6b2c1a3f82398375a3d1174" + integrity sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA== dependencies: - "@jest/console" "^25.1.0" - "@jest/environment" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/console" "^25.3.0" + "@jest/environment" "^25.3.0" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" chalk "^3.0.0" exit "^0.1.2" graceful-fs "^4.2.3" - jest-config "^25.1.0" - jest-docblock "^25.1.0" - jest-haste-map "^25.1.0" - jest-jasmine2 "^25.1.0" - jest-leak-detector "^25.1.0" - jest-message-util "^25.1.0" - jest-resolve "^25.1.0" - jest-runtime "^25.1.0" - jest-util "^25.1.0" - jest-worker "^25.1.0" + jest-config "^25.3.0" + jest-docblock "^25.3.0" + jest-haste-map "^25.3.0" + jest-jasmine2 "^25.3.0" + jest-leak-detector "^25.3.0" + jest-message-util "^25.3.0" + jest-resolve "^25.3.0" + jest-runtime "^25.3.0" + jest-util "^25.3.0" + jest-worker "^25.2.6" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.1.0.tgz#02683218f2f95aad0f2ec1c9cdb28c1dc0ec0314" - integrity sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA== +jest-runtime@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.3.0.tgz#af4d40dbcc590fa5de9910cb6a120a13d131050b" + integrity sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w== dependencies: - "@jest/console" "^25.1.0" - "@jest/environment" "^25.1.0" - "@jest/source-map" "^25.1.0" - "@jest/test-result" "^25.1.0" - "@jest/transform" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/console" "^25.3.0" + "@jest/environment" "^25.3.0" + "@jest/source-map" "^25.2.6" + "@jest/test-result" "^25.3.0" + "@jest/transform" "^25.3.0" + "@jest/types" "^25.3.0" "@types/yargs" "^15.0.0" chalk "^3.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.3" - jest-config "^25.1.0" - jest-haste-map "^25.1.0" - jest-message-util "^25.1.0" - jest-mock "^25.1.0" - jest-regex-util "^25.1.0" - jest-resolve "^25.1.0" - jest-snapshot "^25.1.0" - jest-util "^25.1.0" - jest-validate "^25.1.0" - realpath-native "^1.1.0" + jest-config "^25.3.0" + jest-haste-map "^25.3.0" + jest-message-util "^25.3.0" + jest-mock "^25.3.0" + jest-regex-util "^25.2.6" + jest-resolve "^25.3.0" + jest-snapshot "^25.3.0" + jest-util "^25.3.0" + jest-validate "^25.3.0" + realpath-native "^2.0.0" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.0.0" + yargs "^15.3.1" -jest-serializer@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.1.0.tgz#73096ba90e07d19dec4a0c1dd89c355e2f129e5d" - integrity sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA== +jest-serializer@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-25.2.6.tgz#3bb4cc14fe0d8358489dbbefbb8a4e708ce039b7" + integrity sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ== -jest-snapshot@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.1.0.tgz#d5880bd4b31faea100454608e15f8d77b9d221d9" - integrity sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A== +jest-snapshot@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.3.0.tgz#d4feb457494f4aaedcc83fbbf1ca21808fc3df71" + integrity sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" + "@types/prettier" "^1.19.0" chalk "^3.0.0" - expect "^25.1.0" - jest-diff "^25.1.0" - jest-get-type "^25.1.0" - jest-matcher-utils "^25.1.0" - jest-message-util "^25.1.0" - jest-resolve "^25.1.0" - mkdirp "^0.5.1" + expect "^25.3.0" + jest-diff "^25.3.0" + jest-get-type "^25.2.6" + jest-matcher-utils "^25.3.0" + jest-message-util "^25.3.0" + jest-resolve "^25.3.0" + make-dir "^3.0.0" natural-compare "^1.4.0" - pretty-format "^25.1.0" - semver "^7.1.1" + pretty-format "^25.3.0" + semver "^6.3.0" -jest-util@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.1.0.tgz#7bc56f7b2abd534910e9fa252692f50624c897d9" - integrity sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw== +jest-util@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.2.6.tgz#3c1c95cdfd653126728b0ed861a86610e30d569c" + integrity sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.2.6" chalk "^3.0.0" is-ci "^2.0.0" - mkdirp "^0.5.1" + make-dir "^3.0.0" -jest-validate@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.1.0.tgz#1469fa19f627bb0a9a98e289f3e9ab6a668c732a" - integrity sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA== +jest-util@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.3.0.tgz#e3b0064165818f10d78514696fd25efba82cf049" + integrity sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" + chalk "^3.0.0" + is-ci "^2.0.0" + make-dir "^3.0.0" + +jest-validate@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.3.0.tgz#eb95fdee0039647bcd5d4be641b21e4a142a880c" + integrity sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w== + dependencies: + "@jest/types" "^25.3.0" camelcase "^5.3.1" chalk "^3.0.0" - jest-get-type "^25.1.0" + jest-get-type "^25.2.6" leven "^3.1.0" - pretty-format "^25.1.0" + pretty-format "^25.3.0" -jest-watcher@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.1.0.tgz#97cb4a937f676f64c9fad2d07b824c56808e9806" - integrity sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig== +jest-watcher@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.3.0.tgz#fd03fd5ca52f02bd3161ab177466bf1bfdd34e5c" + integrity sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA== dependencies: - "@jest/test-result" "^25.1.0" - "@jest/types" "^25.1.0" + "@jest/test-result" "^25.3.0" + "@jest/types" "^25.3.0" ansi-escapes "^4.2.1" chalk "^3.0.0" - jest-util "^25.1.0" + jest-util "^25.3.0" string-length "^3.1.0" -jest-worker@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a" - integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg== +jest-worker@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" + integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" -jest@~25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-25.1.0.tgz#b85ef1ddba2fdb00d295deebbd13567106d35be9" - integrity sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w== +jest@~25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-25.3.0.tgz#7a5e59741d94b8662664c77a9f346246d6bf228b" + integrity sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg== dependencies: - "@jest/core" "^25.1.0" + "@jest/core" "^25.3.0" import-local "^3.0.2" - jest-cli "^25.1.0" + jest-cli "^25.3.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= jquery@^3.3.1: version "3.4.1" @@ -5750,7 +6037,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^15.1.1: +jsdom@^15.2.1: version "15.2.1" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== @@ -5822,12 +6109,12 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== +json5@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" + integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsonwebtoken@^8.3.0, jsonwebtoken@~8.5.1: version "8.5.1" @@ -6082,6 +6369,11 @@ lodash@4.17.15, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.1 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +loglevel@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" + integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + lolex@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" @@ -6106,6 +6398,13 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.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" @@ -6197,14 +6496,14 @@ 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.7.6: - version "1.7.6" - resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.7.6.tgz#6fe0d6f35f14e3a9eb49de01277b43efec68596d" - integrity sha512-TSyBVPvyaKDKlqCqr5V/YoIa+DuqMEBb+ACZNPtadllNCc+LRr89vqNIqYSGiK2hhGgdla0qaJYGQ7FQrmiNzQ== +merge-graphql-schemas@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.7.7.tgz#673898f97c384d88fd66e49359b2f604e5864441" + integrity sha512-3mjFHXpsF+bnsnSy/FlZiWCcNo7AULuG8kEBE+YVX8qbzNrEPJVhSg7ANr5LjQZbGtSlTz7fa3Wqw0bfbQ5R5Q== dependencies: - "@graphql-toolkit/file-loading" "0.9.0" - "@graphql-toolkit/schema-merging" "0.9.0" - tslib "1.10.0" + "@graphql-toolkit/file-loading" "0.9.12" + "@graphql-toolkit/schema-merging" "0.9.12" + tslib "1.11.1" merge-stream@^2.0.0: version "2.0.0" @@ -6216,19 +6515,19 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== -metascraper-audio@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.11.6.tgz#392b4b84309ac017bce4b4d0d52948f3a17d7ecc" - integrity sha512-X1nEPP+bgTUStXmWuy/s/h5dix2Smuphx8VdH47/uqXRkifGByQ4nHt9Rd+rg3BNOI15bCib/Nc56awtUOG+3Q== +metascraper-audio@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.11.8.tgz#27119a3120f98c0e7cf1418423ac722a97ea8247" + integrity sha512-Aljyf3CqT3XYRLCt0f83LEwjRBQpZpY44HziNEW95pK/fpabINBZO7+CuzjIaxWL7zr1/CuC1XD822QJcHEMIA== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" -metascraper-author@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.11.6.tgz#45002b550f26fa229a9e7460989ff3efe114cf27" - integrity sha512-OtxpUJR8h0A0J2pUdZrreWtDATJkWZEGO7Ru6aNiMpU4Otk6H5v6wFHR4S41rHVbrfXZzj2hiQV2RcZOu+3JPg== +metascraper-author@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-author/-/metascraper-author-5.11.8.tgz#08da2f24e39916ace3fab62cd09bd8f8dcf32608" + integrity sha512-lxIARoSdnZ4wlvDv1ILcTYd9rT3K1hJTULxrxNq+XUpYPjHsEmqW5LiTqGqpPQAvsJayVsTM7F6cidBIEY+vIA== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" lodash "~4.17.15" metascraper-clearbit-logo@^5.3.0: @@ -6238,12 +6537,12 @@ metascraper-clearbit-logo@^5.3.0: dependencies: got "~9.6.0" -metascraper-date@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.11.6.tgz#81e3bbf6dbdca5b0cc315631ccc6011ac31a758a" - integrity sha512-3AZBTrnb6krZ6z1jcwl3K9H3/hkpRD3O59YEA079GEpyiQE97tPGh3afncYBwahrMfBnT+znebTpfGP0gL+Ueg== +metascraper-date@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.11.8.tgz#718788b6fd878300cc214f162bc118719a0a08c9" + integrity sha512-BryNhvsDZXtHl4Ef0xeP6zGM5CIEBhgP4YOXFd5+8J4/fgEHUKBhS2hnruY+lZ7VZIvjx6UWGYs/zRPaYVR4Hw== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" metascraper-description@^5.11.6: version "5.11.6" @@ -6252,12 +6551,12 @@ metascraper-description@^5.11.6: dependencies: "@metascraper/helpers" "^5.11.6" -metascraper-image@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.11.6.tgz#94ce5cab960ab82d319b9b3034b24084de066297" - integrity sha512-2GB16BhWc2ZX7fK4z8mYmRNxwHZmnHcsb0cjJisJm6lxVexW1mvstqXKxiNCv+yoDtssnXaE7psBsHRP8hAR1Q== +metascraper-image@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-image/-/metascraper-image-5.11.8.tgz#7b0cc60bf667f4a80c82f8b0e2bd516eb81457cf" + integrity sha512-jr3kMS2ZCoNiRoGSCUycO0HvYZcFIXKpFtOazjC6etfd/4NtjnpwxtfEJzN/AUSQwngsutIQdelOMSLnmPec6w== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" metascraper-lang-detector@^4.10.2: version "4.10.2" @@ -6268,12 +6567,12 @@ metascraper-lang-detector@^4.10.2: franc "~4.0.0" iso-639-3 "~1.1.0" -metascraper-lang@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.11.6.tgz#bf8b38c220c472bf46fb1adb78e36b4d2a223cfe" - integrity sha512-gIHrmR6YE1+W2FUmYMggiD8NU7oCuQUYG8fYE0zKxdoAseM2qQcmZ+aGgYAFL4RlgMQwm+9zxhcLX+Te4oMRDw== +metascraper-lang@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-lang/-/metascraper-lang-5.11.8.tgz#a5ccbf6c647b1775a6a71d9da01a5c99a1b43a6f" + integrity sha512-40brNSRfbOXEjfrVGWlMZOiAWe/wmwwIn7Kv3yxkaOcYAr4iWYlYBwEXIqGt5mtGpPDd45kiv0NHS50vXGlTIw== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" metascraper-logo@^5.11.6: version "5.11.6" @@ -6282,60 +6581,60 @@ metascraper-logo@^5.11.6: dependencies: "@metascraper/helpers" "^5.11.6" -metascraper-publisher@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.11.6.tgz#60b4e6f9d130ee754df5ab07301e57ad6617ef21" - integrity sha512-kXV5pVu4a9gCCpiP878mr3IiBRbgFnoSbpTM1mMOQDuOnb7QQjvXQ72IYd77znN3wAh1heGm8BxQm49PLEATLg== +metascraper-publisher@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.11.8.tgz#440923e521adf3f9222d46f3cdfe213ae6d54326" + integrity sha512-UsS2K11oMf5zikcwJfesvc7epyaOKhC/XPTs0bL/MS9SAHv/WFm/4XwGe0QwkRGtD2pCsw3D4ivl0V8rgCGXTA== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" -metascraper-soundcloud@^5.11.7: - version "5.11.7" - resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.11.7.tgz#bfada9cd3189dc223f04e2219bc4e146d75ec1da" - integrity sha512-GPMxSHb1fayrTovLCxBd2HmzHs6eJFgEm37294NBsvzdsb5TwcjyDCd7O9CIARY4Bcw7yL60k1WathSdeAUqgA== +metascraper-soundcloud@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.11.8.tgz#102fdc64677e4f27c7c56be1ecc97b4914b19e25" + integrity sha512-NVYyPkE8D2S4xTuAnmsHkvwxJIhg5DARhvyc/i0W1OF8FwCU3DsX6pBJIHx34q03VBkfFiwde4pTvoPnE58gGw== dependencies: - "@metascraper/helpers" "^5.11.6" - tldts "~5.6.12" + "@metascraper/helpers" "^5.11.8" + tldts "~5.6.19" -metascraper-title@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.11.6.tgz#286d6b0e4a9ee51c54524ea441be50629d4e91f3" - integrity sha512-oIVEo+erZZ1s/3E4VGh1Dk9AGeunHQaR0bslkBT3OuwO0hqf94n5pA0fMmbhmv/Pdon+ZTTL6JV+uEYQnV6EKw== +metascraper-title@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-title/-/metascraper-title-5.11.8.tgz#d490d0e32c9123fd7015fab5ff3deb9de2507ef8" + integrity sha512-KTfxDqw4s/dwZ5bw3SqKogH+prnegc3nhufWpKvIIyz8PjLJw54lKSHzQa1m87O3LFTq+H/BV273MZ9AzGOKuQ== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" lodash "~4.17.15" -metascraper-url@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.11.6.tgz#ecd9b5d4898103b9b1dfbd1f5bc1359ebb7f3b81" - integrity sha512-kQ/CP7AZIsZXFai5PfrvhwSIrwYCngCXZIucmoas2V6hR0wEXkkPjISCMKmiFDvmBZMrVdzJ2xGFI0nhKAgfQw== +metascraper-url@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.11.8.tgz#2d135527e901bff8f5846d47991ae6231cfc7e20" + integrity sha512-91eE1iE/MygDX9pLXSBrOC4w8Ilng3+Cx3NBUiAYys7OKQgmHGGnOjRUoGGBlGc9Fo9VcvJZkI8tgmV7itUyJQ== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" -metascraper-video@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.11.6.tgz#da8a2f81f07891391b1245346750a5450a3ae8c6" - integrity sha512-jxcLqSTvkPku1OMz/x8epDs6mnN3/IgBbcffC2TIzM7yJxcHpzxOGfVcUZ4igwKlz70lk8P8V5gIHMYAFDNdrQ== +metascraper-video@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-video/-/metascraper-video-5.11.8.tgz#7d4a10995d5fb50fe2d931ba3129398ea2ffc627" + integrity sha512-Nk15xqA8WCX0ZDt49mohWY9in/UNuSGGKf0gDxHauhM7e9DyRFgkGLCUDsVWq/izlueveTEbT83/aHjAtUGL1g== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" lodash "~4.17.15" -metascraper-youtube@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.11.6.tgz#3135a2312bab2b6cd8d9575672ea0d521528b439" - integrity sha512-NUkPxNoxg7IfyBCmfy27guTRfMiTmNUlTv7iJgrQJ/WLV7FSzqZ16qioLf7aSSY2/H/LaCClo0Dzeb3qdHKn+g== +metascraper-youtube@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper-youtube/-/metascraper-youtube-5.11.8.tgz#540603c84bf3fcf37a35ace9d107aa48be5e8208" + integrity sha512-cQd07vGY4VQxrF5nc7F2CNQFV7JU+kYd8URr/nApEczMKtw6/FoA6YnuP7K2OaQBxYZtJC53FGsxIvH/yMM6bg== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" get-video-id "~3.1.4" is-reachable "~4.0.0" p-locate "~4.1.0" -metascraper@^5.11.6: - version "5.11.6" - resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.11.6.tgz#0dcae3fadfb0a40e5b9dcd0ccc34c84d7f7b821f" - integrity sha512-6rVHvzxocYdjctlW2Pi7NSxP9MSufcBZHgO66swfzkx/iEEfAKGUPUjbAOqjf9BeTw5zL8Oi8R2lBgtFinN/Tw== +metascraper@^5.11.8: + version "5.11.8" + resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-5.11.8.tgz#af8536e1e61436d0c939394a5dc7ad871f289257" + integrity sha512-AltlRzDO+ydsOyeaF78posFAY3YBqmgy57M2NbU+AKaQ0aWjspxmhXjMA7DOLjfHTDeff7B2115WvLhslbsU5A== dependencies: - "@metascraper/helpers" "^5.11.6" + "@metascraper/helpers" "^5.11.8" cheerio "~1.0.0-rc.3" cheerio-advanced-selectors "~2.0.1" lodash "~4.17.15" @@ -6392,7 +6691,7 @@ mime-db@1.43.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.22, mime-types@~2.1.24, mime-types@~2.1.26: +mime-types@^2.1.12, mime-types@^2.1.26, mime-types@~2.1.19, mime-types@~2.1.22, mime-types@~2.1.24, mime-types@~2.1.26: version "2.1.26" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== @@ -6436,6 +6735,11 @@ minimist@^1.1.1, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -6615,6 +6919,14 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + nocache@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" @@ -6628,7 +6940,7 @@ node-environment-flags@^1.0.5: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@~2.6.0: +node-fetch@^2.1.2, node-fetch@^2.2.0, node-fetch@^2.6.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== @@ -7130,6 +7442,14 @@ parseurl@^1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -7313,17 +7633,17 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@~1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" + integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== -pretty-format@^25.1.0: - version "25.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8" - integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ== +pretty-format@^25.3.0: + version "25.3.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.3.0.tgz#d0a4f988ff4a6cd350342fdabbb809aeb4d49ad5" + integrity sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA== dependencies: - "@jest/types" "^25.1.0" + "@jest/types" "^25.3.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -7401,6 +7721,11 @@ punycode2@~1.0.0: resolved "https://registry.yarnpkg.com/punycode2/-/punycode2-1.0.0.tgz#e2b4b9a9a8ff157d0b84438e203181ee7892dfd8" integrity sha1-4rS5qaj/FX0LhEOOIDGB7niS39g= +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -7421,6 +7746,11 @@ 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" @@ -7544,12 +7874,10 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" +realpath-native@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" + integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== redis-commands@1.5.0: version "1.5.0" @@ -7580,6 +7908,13 @@ regenerate-unicode-properties@^8.1.0: dependencies: regenerate "^1.4.0" +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -7633,6 +7968,18 @@ regexpu-core@^4.6.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -7653,6 +8000,11 @@ regjsgen@^0.5.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== +regjsgen@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" + integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== + regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -7660,6 +8012,13 @@ regjsparser@^0.6.0: dependencies: jsesc "~0.5.0" +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -7759,10 +8118,10 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" - integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== +resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" @@ -7904,6 +8263,11 @@ sanitize-html@~1.22.0: srcset "^2.0.1" 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" @@ -7951,11 +8315,6 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.1.tgz#29104598a197d6cbe4733eeecbe968f7b43a9667" - integrity sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A== - send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -8650,6 +9009,16 @@ title@~3.4.1: clipboardy "1.2.2" titleize "1.0.0" +title@~3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/title/-/title-3.4.2.tgz#1c0acd159c6437296cc73ec743a4b9f7510c6a6f" + integrity sha512-cSNFZ/ChKlX2SfF+k9XvvXkjVa1JrzdGt6v/hoxVig5VaDGRmNHANfawcAdW2mfkd7y+uBHH6n9EHAxJmkO5Hw== + 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" @@ -8660,17 +9029,17 @@ tlds@^1.187.0, tlds@^1.203.0: resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== -tldts-core@^5.6.12: - version "5.6.12" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.6.12.tgz#5774086a65cf9d5fbf0c828dffe2c830dcbe8c17" - integrity sha512-QdqPwO8aBWpLb3SixPijbbWhQyVeDTZJe8UQe9IdiH6F8NCOWl89EGftTeiz/RH74LTY5CWLwh6vcPj7lhqH8A== +tldts-core@^5.6.21: + version "5.6.21" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.6.21.tgz#7e40ecd3101354ed1ac714c7f77928aac579d431" + integrity sha512-DlEQ84r1R9wIkoqvGNOJIxyguoipkhc87B6FQC7K2Bx5jqDmfdAoy5uGm2QL3WdZxi3pszMxx2lyD82G0zCqFg== -tldts@~5.6.12: - version "5.6.12" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.6.12.tgz#ae7096e70fda948753bac9f2731da4663d01b45c" - integrity sha512-jq3re1oUJpCTGCj3PbBgBQum2Lvsrkt/D9Tj/HB8e6ET+xi7yIBYzcXddJYwNBC7Vit3XQz4Jj8nGIeuOlRFQA== +tldts@~5.6.19: + version "5.6.21" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.6.21.tgz#b7bfd2e2bece52ab9dc9e868bbf7cf00470b510e" + integrity sha512-Ot/lciG0UGLsaergjjRafpqU5QJFMOuSGHHqymgg15dhmwQ7vKYq/kNxQbqg4TE4OjPnGE7wV8QbTPWpH2kzzQ== dependencies: - tldts-core "^5.6.12" + tldts-core "^5.6.21" tmp@^0.0.33: version "0.0.33" @@ -8812,10 +9181,10 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -tslib@1.10.0, 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== +tslib@1.11.1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== tunnel-agent@^0.6.0: version "0.6.0" @@ -8901,6 +9270,11 @@ unicode-match-property-value-ecmascript@^1.1.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + unicode-property-aliases-ecmascript@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" @@ -9029,6 +9403,14 @@ url-regex@~5.0.0: ip-regex "^4.1.0" tlds "^1.203.0" +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -9064,15 +9446,20 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +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== + uuid@^3.1.0, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@~7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" - integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== +uuid@^7.0.2, uuid@~7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" + integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== v8-compile-cache@^2.0.3: version "2.1.0" @@ -9200,7 +9587,7 @@ which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@^2.0.1: +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -9308,7 +9695,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.17: +xml2js@0.4.19, xml2js@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== @@ -9353,18 +9740,18 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== +yargs-parser@^18.1.1: + version "18.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" + integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.0.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" - integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== +yargs@^15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -9376,7 +9763,7 @@ yargs@^15.0.0: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^16.1.0" + yargs-parser "^18.1.1" yup@^0.28.3: version "0.28.3" @@ -9391,10 +9778,10 @@ yup@^0.28.3: synchronous-promise "^2.0.10" toposort "^2.0.2" -zen-observable-ts@^0.8.20: - version "0.8.20" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz#44091e335d3fcbc97f6497e63e7f57d5b516b163" - integrity sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA== +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== dependencies: tslib "^1.9.3" zen-observable "^0.8.0" diff --git a/deployment/digital-ocean/README.md b/deployment/digital-ocean/README.md index 12c272691..a71eed996 100644 --- a/deployment/digital-ocean/README.md +++ b/deployment/digital-ocean/README.md @@ -24,3 +24,15 @@ Digital Ocean kubernetes clusters don't have a graphical interface, so I suggest to setup the [kubernetes dashboard](./dashboard/README.md) as a next step. Configuring [HTTPS](./https/README.md) is bit tricky and therefore I suggest to do this as a last step. + +## Spaces + +We are storing our images in the s3-compatible [DigitalOcean Spaces](https://www.digitalocean.com/docs/spaces/). + +We still want to take backups of our images in case something happens to the images in the cloud. See these [instructions](https://www.digitalocean.com/docs/spaces/resources/s3cmd-usage/) about getting set up with `s3cmd` to take a copy of all images in a `Spaces` namespace, ie `human-connection-uploads`. + +After configuring `s3cmd` with your credentials, etc. you should be able to make a backup with this command. + +```sh +s3cmg get --recursive s3://human-connection-uploads --skip-existing +``` \ No newline at end of file diff --git a/package.json b/package.json index fd1f3d5a5..4a1b9a293 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "human-connection", - "version": "0.5.0", + "version": "0.6.1", "description": "Fullstack and API tests with cypress and cucumber for Human Connection", "author": "Human Connection gGmbh", "license": "MIT", @@ -26,21 +26,21 @@ "generate:changelog": "yarn version && auto-changelog" }, "devDependencies": { - "@babel/core": "^7.8.7", - "@babel/preset-env": "^7.8.7", - "@babel/register": "^7.8.6", - "auto-changelog": "^1.16.2", + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@babel/register": "^7.9.0", + "auto-changelog": "^1.16.4", "bcryptjs": "^2.4.3", "codecov": "^3.6.5", "cross-env": "^7.0.2", "cucumber": "^6.0.5", "cypress": "^4.2.0", - "cypress-cucumber-preprocessor": "^2.0.1", + "cypress-cucumber-preprocessor": "^2.2.1", "cypress-file-upload": "^3.5.3", "cypress-plugin-retries": "^1.5.2", - "date-fns": "^2.11.0", + "date-fns": "^2.12.0", "dotenv": "^8.2.0", - "expect": "^25.1.0", + "expect": "^25.3.0", "faker": "Marak/faker.js#master", "graphql-request": "^1.8.2", "import": "^0.0.6", diff --git a/webapp/app/router.scrollBehavior.js b/webapp/app/router.scrollBehavior.js index d34c4c38a..a87054048 100644 --- a/webapp/app/router.scrollBehavior.js +++ b/webapp/app/router.scrollBehavior.js @@ -1,4 +1,4 @@ -export default function(to, from, savedPosition) { +export default function (to, from, savedPosition) { if (savedPosition) return savedPosition // Edge case: If you click on a notification from a comment and then on the diff --git a/webapp/assets/_new/icons/index.js b/webapp/assets/_new/icons/index.js index daa0714f2..bc9ef6638 100644 --- a/webapp/assets/_new/icons/index.js +++ b/webapp/assets/_new/icons/index.js @@ -2,7 +2,7 @@ const svgFileList = require.context('./svgs', true, /\.svg/) const icons = {} const iconNames = [] -svgFileList.keys().forEach(fileName => { +svgFileList.keys().forEach((fileName) => { const svgCode = svgFileList(fileName) const iconName = fileName.replace('./', '').replace('.svg', '') icons[iconName] = svgCode diff --git a/webapp/assets/_new/styles/resets.scss b/webapp/assets/_new/styles/resets.scss index 144f22d10..72a6184b3 100644 --- a/webapp/assets/_new/styles/resets.scss +++ b/webapp/assets/_new/styles/resets.scss @@ -19,3 +19,10 @@ h6, p { margin: 0; } + +ul, +ol { + list-style-type: none; + padding: 0; + margin: 0; +} diff --git a/webapp/assets/_new/styles/tokens.scss b/webapp/assets/_new/styles/tokens.scss index 9e86b3c70..e87750fb6 100644 --- a/webapp/assets/_new/styles/tokens.scss +++ b/webapp/assets/_new/styles/tokens.scss @@ -230,6 +230,7 @@ $space-small: 16px; $space-x-small: 8px; $space-xx-small: 4px; $space-xxx-small: 2px; +$space-none: 0; /** * @tokens Size Height @@ -240,6 +241,7 @@ $size-height-base: 42px; $size-height-large: 50px; $size-height-xlarge: 60px; $size-height-footer: 64px; +$size-height-connections: 315px; $size-tappable-square: 44px; $size-ribbon: 6px; @@ -248,7 +250,9 @@ $size-ribbon: 6px; * @presenter Spacing */ +$size-width-filter-sidebar: 85px; $size-width-paginate: 100px; +$size-max-width-filter-menu: 1026px; /** * @tokens Size Avatar diff --git a/webapp/components/AvatarMenu/AvatarMenu.spec.js b/webapp/components/AvatarMenu/AvatarMenu.spec.js index c432a5ad8..85f5c32a8 100644 --- a/webapp/components/AvatarMenu/AvatarMenu.spec.js +++ b/webapp/components/AvatarMenu/AvatarMenu.spec.js @@ -21,7 +21,7 @@ describe('AvatarMenu.vue', () => { return { href: '/profile/u343/matt' } }), }, - $t: jest.fn(a => a), + $t: jest.fn((a) => a), } getters = { 'auth/user': () => { @@ -86,21 +86,21 @@ describe('AvatarMenu.vue', () => { it('displays a link to user profile', () => { const profileLink = wrapper .findAll('.ds-menu-item span') - .at(wrapper.vm.routes.findIndex(route => route.path === '/profile/u343/matt')) + .at(wrapper.vm.routes.findIndex((route) => route.path === '/profile/u343/matt')) expect(profileLink.exists()).toBe(true) }) it('displays a link to the notifications page', () => { const notificationsLink = wrapper .findAll('.ds-menu-item span') - .at(wrapper.vm.routes.findIndex(route => route.path === '/notifications')) + .at(wrapper.vm.routes.findIndex((route) => route.path === '/notifications')) expect(notificationsLink.exists()).toBe(true) }) it('displays a link to the settings page', () => { const settingsLink = wrapper .findAll('.ds-menu-item span') - .at(wrapper.vm.routes.findIndex(route => route.path === '/settings')) + .at(wrapper.vm.routes.findIndex((route) => route.path === '/settings')) expect(settingsLink.exists()).toBe(true) }) }) @@ -121,7 +121,7 @@ describe('AvatarMenu.vue', () => { it('displays a link to moderation page', () => { const moderationLink = wrapper .findAll('.ds-menu-item span') - .at(wrapper.vm.routes.findIndex(route => route.path === '/moderation')) + .at(wrapper.vm.routes.findIndex((route) => route.path === '/moderation')) expect(moderationLink.exists()).toBe(true) }) @@ -147,7 +147,7 @@ describe('AvatarMenu.vue', () => { it('displays a link to admin page', () => { const adminLink = wrapper .findAll('.ds-menu-item span') - .at(wrapper.vm.routes.findIndex(route => route.path === '/admin')) + .at(wrapper.vm.routes.findIndex((route) => route.path === '/admin')) expect(adminLink.exists()).toBe(true) }) diff --git a/webapp/components/AvatarMenu/AvatarMenu.vue b/webapp/components/AvatarMenu/AvatarMenu.vue index f65c6f6cf..63c550fd3 100644 --- a/webapp/components/AvatarMenu/AvatarMenu.vue +++ b/webapp/components/AvatarMenu/AvatarMenu.vue @@ -20,7 +20,7 @@ {{ $t('login.hello') }} {{ userName }} diff --git a/webapp/components/CommentCard/CommentCard.spec.js b/webapp/components/CommentCard/CommentCard.spec.js index b18ab67c0..0ebcb2649 100644 --- a/webapp/components/CommentCard/CommentCard.spec.js +++ b/webapp/components/CommentCard/CommentCard.spec.js @@ -29,8 +29,8 @@ describe('CommentCard.vue', () => { locale: () => 'en', }, $filters: { - truncate: a => a, - removeHtml: a => a, + truncate: (a) => a, + removeHtml: (a) => a, }, $route: { hash: '' }, $scrollTo: jest.fn(), diff --git a/webapp/components/CommentForm/CommentForm.spec.js b/webapp/components/CommentForm/CommentForm.spec.js index b940c561d..996e6ecfc 100644 --- a/webapp/components/CommentForm/CommentForm.spec.js +++ b/webapp/components/CommentForm/CommentForm.spec.js @@ -25,7 +25,7 @@ describe('CommentForm.vue', () => { success: jest.fn(), }, $filters: { - removeHtml: a => a, + removeHtml: (a) => a, }, } }) diff --git a/webapp/components/CommentForm/CommentForm.vue b/webapp/components/CommentForm/CommentForm.vue index 55f675656..4bdb95f90 100644 --- a/webapp/components/CommentForm/CommentForm.vue +++ b/webapp/components/CommentForm/CommentForm.vue @@ -104,7 +104,7 @@ export default { this.disabled = true this.$apollo .mutate(mutateParams) - .then(res => { + .then((res) => { this.loading = false if (!this.update) { const { @@ -125,7 +125,7 @@ export default { this.closeEditWindow() } }) - .catch(err => { + .catch((err) => { this.$toast.error(err.message) }) }, diff --git a/webapp/components/CommentList/CommentList.spec.js b/webapp/components/CommentList/CommentList.spec.js index a3d7ca7b2..66c16263c 100644 --- a/webapp/components/CommentList/CommentList.spec.js +++ b/webapp/components/CommentList/CommentList.spec.js @@ -6,7 +6,7 @@ import Vue from 'vue' const localVue = global.localVue -localVue.filter('truncate', string => string) +localVue.filter('truncate', (string) => string) localVue.directive('scrollTo', jest.fn()) config.stubs['v-popover'] = '' @@ -42,8 +42,8 @@ describe('CommentList.vue', () => { mocks = { $t: jest.fn(), $filters: { - truncate: a => a, - removeHtml: a => a, + truncate: (a) => a, + removeHtml: (a) => a, }, $scrollTo: jest.fn(), $route: { hash: '' }, diff --git a/webapp/components/CommentList/CommentList.story.js b/webapp/components/CommentList/CommentList.story.js index 1f96b1ad0..3ef474c80 100644 --- a/webapp/components/CommentList/CommentList.story.js +++ b/webapp/components/CommentList/CommentList.story.js @@ -6,7 +6,7 @@ import faker from 'faker' helpers.init() -const commentMock = fields => { +const commentMock = (fields) => { return { id: faker.random.uuid(), title: faker.lorem.sentence(), diff --git a/webapp/components/CommentList/CommentList.vue b/webapp/components/CommentList/CommentList.vue index 1cff75138..377380325 100644 --- a/webapp/components/CommentList/CommentList.vue +++ b/webapp/components/CommentList/CommentList.vue @@ -48,7 +48,7 @@ export default { return anchor === '#comments' }, updateCommentList(updatedComment) { - this.postComments = this.postComments.map(comment => { + this.postComments = this.postComments.map((comment) => { return comment.id === updatedComment.id ? updatedComment : comment }) }, diff --git a/webapp/components/ContentMenu/ContentMenu.spec.js b/webapp/components/ContentMenu/ContentMenu.spec.js index bbb0c0941..b49a1158a 100644 --- a/webapp/components/ContentMenu/ContentMenu.spec.js +++ b/webapp/components/ContentMenu/ContentMenu.spec.js @@ -17,7 +17,7 @@ let getters, mutations, mocks, menuToggle, openModalSpy describe('ContentMenu.vue', () => { beforeEach(() => { mocks = { - $t: jest.fn(str => str), + $t: jest.fn((str) => str), $i18n: { locale: () => 'en', }, @@ -68,7 +68,7 @@ describe('ContentMenu.vue', () => { expect( wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'post.menu.edit') + .filter((item) => item.text() === 'post.menu.edit') .at(0) .find('span.ds-menu-item-link') .attributes('to'), @@ -78,7 +78,7 @@ describe('ContentMenu.vue', () => { it('can delete the contribution', () => { wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'post.menu.delete') + .filter((item) => item.text() === 'post.menu.delete') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('confirm', 'delete') @@ -98,7 +98,7 @@ describe('ContentMenu.vue', () => { }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'post.menu.pin') + .filter((item) => item.text() === 'post.menu.pin') .at(0) .trigger('click') expect(wrapper.emitted('pinPost')).toEqual([ @@ -122,7 +122,7 @@ describe('ContentMenu.vue', () => { }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'post.menu.unpin') + .filter((item) => item.text() === 'post.menu.unpin') .at(0) .trigger('click') expect(wrapper.emitted('unpinPost')).toEqual([ @@ -151,7 +151,7 @@ describe('ContentMenu.vue', () => { it('edit the comment', () => { wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'comment.menu.edit') + .filter((item) => item.text() === 'comment.menu.edit') .at(0) .trigger('click') expect(wrapper.emitted('editComment')).toBeTruthy() @@ -159,7 +159,7 @@ describe('ContentMenu.vue', () => { it('delete the comment', () => { wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'comment.menu.delete') + .filter((item) => item.text() === 'comment.menu.delete') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('confirm', 'delete') @@ -180,7 +180,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'report.contribution.title') + .filter((item) => item.text() === 'report.contribution.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('report') @@ -197,7 +197,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'report.comment.title') + .filter((item) => item.text() === 'report.comment.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('report') @@ -214,7 +214,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'report.user.title') + .filter((item) => item.text() === 'report.user.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('report') @@ -231,7 +231,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'report.organization.title') + .filter((item) => item.text() === 'report.organization.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('report') @@ -253,7 +253,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'disable.contribution.title') + .filter((item) => item.text() === 'disable.contribution.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('disable') @@ -271,7 +271,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'disable.comment.title') + .filter((item) => item.text() === 'disable.comment.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('disable') @@ -289,7 +289,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'disable.user.title') + .filter((item) => item.text() === 'disable.user.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('disable') @@ -307,7 +307,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'disable.organization.title') + .filter((item) => item.text() === 'disable.organization.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('disable') @@ -325,7 +325,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'release.contribution.title') + .filter((item) => item.text() === 'release.contribution.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('release') @@ -343,7 +343,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'release.comment.title') + .filter((item) => item.text() === 'release.comment.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('release') @@ -361,7 +361,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'release.user.title') + .filter((item) => item.text() === 'release.user.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('release') @@ -379,7 +379,7 @@ describe('ContentMenu.vue', () => { openModalSpy = jest.spyOn(wrapper.vm, 'openModal') wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'release.organization.title') + .filter((item) => item.text() === 'release.organization.title') .at(0) .trigger('click') expect(openModalSpy).toHaveBeenCalledWith('release') @@ -400,7 +400,7 @@ describe('ContentMenu.vue', () => { expect( wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'settings.name') + .filter((item) => item.text() === 'settings.name') .at(0) .find('span.ds-menu-item-link') .attributes('to'), @@ -418,7 +418,7 @@ describe('ContentMenu.vue', () => { }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'settings.muted-users.mute') + .filter((item) => item.text() === 'settings.muted-users.mute') .at(0) .trigger('click') expect(wrapper.emitted('mute')).toEqual([ @@ -442,7 +442,7 @@ describe('ContentMenu.vue', () => { }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'settings.muted-users.unmute') + .filter((item) => item.text() === 'settings.muted-users.unmute') .at(0) .trigger('click') expect(wrapper.emitted('unmute')).toEqual([ diff --git a/webapp/components/ContentMenu/ContentMenu.vue b/webapp/components/ContentMenu/ContentMenu.vue index ee324bb2b..0bcfeb3cd 100644 --- a/webapp/components/ContentMenu/ContentMenu.vue +++ b/webapp/components/ContentMenu/ContentMenu.vue @@ -46,7 +46,7 @@ export default { resourceType: { type: String, required: true, - validator: value => { + validator: (value) => { return value.match(/(contribution|comment|organization|user)/) }, }, diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 585980cc2..be2228845 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -140,7 +140,9 @@ describe('ContributionForm.vue', () => { postTitleInput = wrapper.find('.ds-input') postTitleInput.setValue(postTitle) await wrapper.vm.updateEditorContent(postContent) - englishLanguage = wrapper.findAll('li').filter(language => language.text() === 'English') + englishLanguage = wrapper + .findAll('li') + .filter((language) => language.text() === 'English') englishLanguage.trigger('click') dataPrivacyButton = await wrapper .find(CategoriesSelect) @@ -206,7 +208,9 @@ describe('ContributionForm.vue', () => { postTitleInput.setValue(postTitle) await wrapper.vm.updateEditorContent(postContent) wrapper.find(CategoriesSelect).setData({ categories }) - englishLanguage = wrapper.findAll('li').filter(language => language.text() === 'English') + englishLanguage = wrapper + .findAll('li') + .filter((language) => language.text() === 'English') englishLanguage.trigger('click') await Vue.nextTick() dataPrivacyButton = await wrapper @@ -223,7 +227,9 @@ describe('ContributionForm.vue', () => { it('supports changing the language', async () => { expectedParams.variables.language = 'de' - deutschLanguage = wrapper.findAll('li').filter(language => language.text() === 'Deutsch') + deutschLanguage = wrapper + .findAll('li') + .filter((language) => language.text() === 'Deutsch') deutschLanguage.trigger('click') wrapper.find('form').trigger('submit') expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expect.objectContaining(expectedParams)) @@ -237,7 +243,7 @@ describe('ContributionForm.vue', () => { } const spy = jest .spyOn(FileReader.prototype, 'readAsDataURL') - .mockImplementation(function() { + .mockImplementation(function () { this.onload({ target: { result: 'someUrlToImage' } }) }) wrapper.find(ImageUploader).vm.$emit('addHeroImage', imageUpload) @@ -288,7 +294,9 @@ describe('ContributionForm.vue', () => { await wrapper.vm.updateEditorContent(postContent) categoryIds = ['cat12'] wrapper.find(CategoriesSelect).setData({ categories }) - englishLanguage = wrapper.findAll('li').filter(language => language.text() === 'English') + englishLanguage = wrapper + .findAll('li') + .filter((language) => language.text() === 'English') englishLanguage.trigger('click') await Vue.nextTick() dataPrivacyButton = await wrapper diff --git a/webapp/components/ContributionForm/ContributionForm.vue b/webapp/components/ContributionForm/ContributionForm.vue index 2afee0763..20c9c2388 100644 --- a/webapp/components/ContributionForm/ContributionForm.vue +++ b/webapp/components/ContributionForm/ContributionForm.vue @@ -108,7 +108,7 @@ export default { data() { const { title, content, image, language, categories } = this.contribution - const languageOptions = orderBy(locales, 'name').map(locale => { + const languageOptions = orderBy(locales, 'name').map((locale) => { return { label: locale.name, value: locale.code } }) const { sensitive: imageBlurred = false, aspectRatio: imageAspectRatio = null } = image || {} @@ -120,8 +120,8 @@ export default { image: image || null, imageAspectRatio, imageBlurred, - language: languageOptions.find(option => option.value === language) || null, - categoryIds: categories ? categories.map(category => category.id) : [], + language: languageOptions.find((option) => option.value === language) || null, + categoryIds: categories ? categories.map((category) => category.id) : [], }, formSchema: { title: { required: true, min: 3, max: 100 }, @@ -190,7 +190,7 @@ export default { params: { id: result.id, slug: result.slug }, }) }) - .catch(err => { + .catch((err) => { this.$toast.error(err.message) this.loading = false }) diff --git a/webapp/components/DeleteData/DeleteData.vue b/webapp/components/DeleteData/DeleteData.vue index 8d2780076..ab22918fb 100644 --- a/webapp/components/DeleteData/DeleteData.vue +++ b/webapp/components/DeleteData/DeleteData.vue @@ -92,7 +92,7 @@ export default { this.logout() this.$router.history.push('/') }) - .catch(error => { + .catch((error) => { this.$toast.error(error.message) }) }, diff --git a/webapp/components/DonationInfo/DonationInfo.spec.js b/webapp/components/DonationInfo/DonationInfo.spec.js index 157801dcf..12f6c7652 100644 --- a/webapp/components/DonationInfo/DonationInfo.spec.js +++ b/webapp/components/DonationInfo/DonationInfo.spec.js @@ -12,7 +12,7 @@ describe('DonationInfo.vue', () => { beforeEach(() => { mocks = { - $t: jest.fn(string => string), + $t: jest.fn((string) => string), $i18n: { locale: () => 'de', }, @@ -22,19 +22,11 @@ describe('DonationInfo.vue', () => { const Wrapper = () => mount(DonationInfo, { mocks, localVue }) it('includes a link to the Human Connection donations website', () => { - expect( - Wrapper() - .find('a') - .attributes('href'), - ).toBe('https://human-connection.org/spenden/') + expect(Wrapper().find('a').attributes('href')).toBe('https://human-connection.org/spenden/') }) it('displays a call to action button', () => { - expect( - Wrapper() - .find('.base-button') - .text(), - ).toBe('donations.donate-now') + expect(Wrapper().find('.base-button').text()).toBe('donations.donate-now') }) it.skip('creates a title from the current month and a translation string', () => { diff --git a/webapp/components/Dropdown.vue b/webapp/components/Dropdown.vue index be1157961..6a5d07083 100644 --- a/webapp/components/Dropdown.vue +++ b/webapp/components/Dropdown.vue @@ -48,8 +48,9 @@ export default { if (isOpen) { this.$nextTick(() => { setTimeout(() => { - const paddingRightStyle = `${window.innerWidth - - document.documentElement.clientWidth}px` + const paddingRightStyle = `${ + window.innerWidth - document.documentElement.clientWidth + }px` const navigationElement = document.querySelector('.main-navigation') document.body.style.paddingRight = paddingRightStyle document.body.classList.add('dropdown-open') diff --git a/webapp/components/DropdownFilter/DropdownFilter.spec.js b/webapp/components/DropdownFilter/DropdownFilter.spec.js index 8fb1b408f..b7c2be1d7 100644 --- a/webapp/components/DropdownFilter/DropdownFilter.spec.js +++ b/webapp/components/DropdownFilter/DropdownFilter.spec.js @@ -10,7 +10,7 @@ describe('DropdownFilter.vue', () => { beforeEach(() => { propsData = {} mocks = { - $t: jest.fn(a => a), + $t: jest.fn((a) => a), } }) @@ -43,7 +43,7 @@ describe('DropdownFilter.vue', () => { wrapper.find('.dropdown-filter').trigger('click') allLink = wrapper .findAll('.dropdown-menu-item') - .at(propsData.filterOptions.findIndex(option => option.label === 'All')) + .at(propsData.filterOptions.findIndex((option) => option.label === 'All')) }) it('displays a link for All', () => { @@ -53,21 +53,21 @@ describe('DropdownFilter.vue', () => { it('displays a link for Read', () => { const readLink = wrapper .findAll('.dropdown-menu-item') - .at(propsData.filterOptions.findIndex(option => option.label === 'Read')) + .at(propsData.filterOptions.findIndex((option) => option.label === 'Read')) expect(readLink.text()).toEqual('Read') }) it('displays a link for Unread', () => { const unreadLink = wrapper .findAll('.dropdown-menu-item') - .at(propsData.filterOptions.findIndex(option => option.label === 'Unread')) + .at(propsData.filterOptions.findIndex((option) => option.label === 'Unread')) expect(unreadLink.text()).toEqual('Unread') }) it('clicking on menu item emits filter', () => { allLink.trigger('click') expect(wrapper.emitted().filter[0]).toEqual( - propsData.filterOptions.filter(option => option.label === 'All'), + propsData.filterOptions.filter((option) => option.label === 'All'), ) }) }) diff --git a/webapp/components/Editor/Editor.story.js b/webapp/components/Editor/Editor.story.js index 381c2e7ea..0db445eb1 100644 --- a/webapp/components/Editor/Editor.story.js +++ b/webapp/components/Editor/Editor.story.js @@ -35,7 +35,7 @@ const users = [ storiesOf('Editor', module) .addDecorator(withA11y) - .addDecorator(storyFn => { + .addDecorator((storyFn) => { const ctx = storyFn() return { components: { ctx }, diff --git a/webapp/components/Editor/Editor.vue b/webapp/components/Editor/Editor.vue index 44ed0d15e..f0e9c7909 100644 --- a/webapp/components/Editor/Editor.vue +++ b/webapp/components/Editor/Editor.vue @@ -80,7 +80,7 @@ export default { items: () => { return this.users }, - onEnter: props => this.openSuggestionList(props, MENTION), + onEnter: (props) => this.openSuggestionList(props, MENTION), onChange: this.updateSuggestionList, onExit: this.closeSuggestionList, onKeyDown: this.navigateSuggestionList, @@ -95,7 +95,7 @@ export default { items: () => { return this.hashtags }, - onEnter: props => this.openSuggestionList(props, HASHTAG), + onEnter: (props) => this.openSuggestionList(props, HASHTAG), onChange: this.updateSuggestionList, onExit: this.closeSuggestionList, onKeyDown: this.navigateSuggestionList, @@ -109,7 +109,7 @@ export default { watch: { placeholder: { immediate: true, - handler: function(val) { + handler: function (val) { if (!val || !this.editor) { return } @@ -129,7 +129,7 @@ export default { new EventHandler(), new History(), ], - onUpdate: e => { + onUpdate: (e) => { clearTimeout(throttleInputEvent) throttleInputEvent = setTimeout(() => this.onUpdate(e), 300) }, @@ -197,7 +197,7 @@ export default { return items.slice(0, 15) } - const filteredList = items.filter(item => { + const filteredList = items.filter((item) => { const itemString = item.slug || item.id return itemString.toLowerCase().includes(query.toLowerCase()) }) diff --git a/webapp/components/Editor/MenuBar.vue b/webapp/components/Editor/MenuBar.vue index d1e084f2d..3756e1ae2 100644 --- a/webapp/components/Editor/MenuBar.vue +++ b/webapp/components/Editor/MenuBar.vue @@ -14,7 +14,7 @@ diff --git a/webapp/components/Editor/SuggestionList.vue b/webapp/components/Editor/SuggestionList.vue index 5e9c146a0..54b7c7316 100644 --- a/webapp/components/Editor/SuggestionList.vue +++ b/webapp/components/Editor/SuggestionList.vue @@ -11,7 +11,7 @@